块完成后如何访问__block变量?

时间:2013-07-10 13:42:04

标签: ios objective-c objective-c-blocks parse-platform

我正在使用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);

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:3)

你不是。好吧,你可以像你一样访问它。但是块的目的是在信息实际可用时经过一段时间后异步调用它,所以你应该在块中进行处理或者从块中调用另一个方法来执行它。

答案 2 :(得分:1)

块中的代码是异步运行的。所以块之后的代码在块中的代码有机会运行之前运行(或者至少完成)。

请参阅developer.apple.com Working with Blocks

上的本教程