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 回答