4

Parse.com でいくつかのバックグラウンド操作を行っていますが、これは__block変数に関する一般的な質問です。変数を定義し、完了ブロックでバックグラウンド ネットワーク操作を実行し、場合によってはブロック内でその変数を変更してから、ブロック外でアクセスしたいと考えています。しかし、それは常にゼロです。

ブロックの外で変数を保持するにはどうすればよいですか? これはクラス メソッド内にあるため、インスタンス変数を使用することはできません。

__block PFObject *myObject = nil;

PFQuery *query = [PFQuery queryWithClassName:@"ClassName"];
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
   if (objects.count) {
       myObject = [objects lastObject];
   }
}];

NSLog(@"%@",myObject);
4

3 に答える 3

11

他の変数と同じように、ブロックの外で使用できます。

現在のコードでは、このログは nil を出力します。これは、ブロック内のコードが非同期で実行されるためです。この場合、検索結果が返されたときです。

から意味のある値が必要な場合はmyObject、割り当て後にログをブロック内に配置する必要がありますmyObject

コメントで実行の順序を参照してください。

 __block PFObject *myObject = nil;             //1

PFQuery *query = [PFQuery queryWithClassName:@"ClassName"];   //2
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {  //3
   if (objects.count)     //5
       myObject = [objects lastObject];   //6
}];                                       //7

NSLog(@"%@",myObject);   //4
于 2013-07-10T13:45:05.347 に答える
3

あなたはそうしない。まあ、あなたはあなたのようにそれにアクセスすることができます。ただし、ブロックの目的は、情報が実際に利用可能になったときに少し遅れて非同期で呼び出されるため、ブロックで処理を行うか、ブロックから別のメソッドを呼び出して実行する必要があります。

于 2013-07-10T13:44:42.793 に答える
1

ブロック内のコードは非同期で実行されます。したがって、ブロック内のコードが実行される前に、ブロックの後のコードが実行されます (または、少なくとも確実に完了します)。

developer.apple.comでこのチュートリアルを参照してください。

于 2013-07-10T13:47:25.570 に答える