2016-04-24 10 views
0

は、このタイプのエラーのために検索した後:Objective-Cのid型ブロック内の変数にアクセスする方法は?

Variable is not assignable (missing __block type specifier)

私は、次の解決策Assign a variable inside a Block to a variable outside a Blockを発見し、私は受け入れ答えの恩恵を受けることができませんでしたし、私のコードが別のシナリオである__blockについて読んだ後。

NSDictionary *strongUser = [[NSDictionary alloc]init]; 
__block NSDictionary *user = strongUser; 

NSMutableDictionary* parameters = [NSMutableDictionary dictionary]; 
[parameters setValue:@"id, name, email" forKey:@"fields"]; 
[[[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:parameters] 
    startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) { 
     user = result; 
}]; 

NSLog(@"%@",user); 

NSLog印刷何も

私は指定された結果値にあるが、ブロックの外側の変数をexternにしたい:ここ

は、私が使用していたコードです。

enter image description here

+0

完了ハンドラはどうですか?終了しましたか? –

+0

完了ハンドラが完了しました –

+0

「結果」パラメータが必要ですか? –

答えて

0

私は__block NSDictionary *strongUserを使用してお勧めします。私は、ポインタuserがブロック内にまだ存在しているが、それが指している基になる変数はもはやアクセス可能ではないと懸念しています。たとえば:

__block NSDictionary *strongUser = [[NSDictionary alloc]init]; 

NSMutableDictionary* parameters = [NSMutableDictionary dictionary]; 
[parameters setValue:@"id, name, email" forKey:@"fields"]; 
[[[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:parameters] 
startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) 
{ 
    strongUser = result; 
}]; 
+0

詳細な答えを提供することができますか? –

+0

私は同じ問題を解決しようとしました –

0

は、以下の中にあなたのブロックを追加します。

NSLog(@"Doing assignment inside the block"); 

は、次に、あなたのコードを実行します。

あなたの質問に対する答えは明白です。

HTH

+0

あなたは何を言っているのか理解できませんでした –

+0

あなたのコードを実行すると、2つのログステートメントはどのような順序で印刷されますか? – CRD

+0

ブロックの外側のログはブロックの内側で実行されていますが、私はそれを知っていますが、解決策が必要です –

0

あなたはあなたのコードの非同期を実行し、あなたのログが完了ハンドラの前に評価されます。
完了ハンドラのスコープ内に直接ログを追加します。

NSDictionary *strongUser = [[NSDictionary alloc]init]; 
__block NSDictionary *user = strongUser; 

NSMutableDictionary* parameters = [NSMutableDictionary dictionary]; 
[parameters setValue:@"id, name, email" forKey:@"fields"]; 
[[[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:parameters] 
startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) 
{ 
    user = result; 

    NSLog(@"%@",user); 
}]; 
+0

はい、すでにこれについてはhttps://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/Blocks/Articles/bxVariables.html#//apple_ref/doc/uid/TP40007502-CH6-SW6でお読みください。私は私の問題を解決することができます –

+0

私の更新されたコードスニペットを見てください。 –

+0

ブロック内のログは私に結果を与えますが、ブロック外の値にアクセスする必要があります –

0

あなたはローカル変数strongUserを持って、それがこのスコープ(機能)が終了される時、あなたのローカル変数strongUserが割り当て解除されることを意味します - あなたのブロックが動作するときに__blockのvariavleユーザーは生きているが、それはユネキシストを指しますオブジェクト。

@property (nonatomic, strong) NSDictionary *strongUser; 

- (NSDictionary *)strongUser { 
    if (!_strongUser) { 
     _strongUser = [[NSDictionary alloc] init]; 
    } 
    return _strongUser; 
} 

そしてselfinsideブロックとそれを呼び出す:

右のそれを実装するための簡単なwasyは怠惰なセッターとプロパティを作成することです

NSMutableDictionary* parameters = [NSMutableDictionary dictionary]; 
    [parameters setValue:@"id, name, email" forKey:@"fields"]; 

    [[[FBSDKGraphRequest alloc] initWithGraphPath:@"me"parameters:parameters] 
startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) { 
    self.strongUser = result; 
    NSLog(@"%@",self.strongUser); 
    }]; 

はそれが役に立てば幸い!

+0

同じ問題が続きます。S –

+0

@ZakariaDarwish最後の行のNSLogで結果の値を取得しません。これは、完了ブロックより前に動作するためです。完了の後、結果の値はstrongUserに設定されます。 –

+0

完了がいつ完了するかを知る方法を教えてください –

関連する問題