块完成后,如何访问__blockvariables?

我正在做一些与Parse.com后台操作,但这是一个关于__blockvariables的一般问题。 我想定义一个variables,用一个完成块运行后台networking操作,可能修改块内的variables,然后在块外部访问它。 但总是零。

如何保留块外的variables? 这是一个类方法,所以使用实例variables不是一个选项。

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

你可以像使用其他variables一样在块外部使用它们。

在你当前的代码中,这个日志会打印nil,因为块内部的代码是asynchronous执行的,在这种情况下 – 当search结果返回时。

如果你想从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 

你没有。 那么,你可以像你一样访问它。 但是这个块的目的是,当信息实际可用时,它会在一段延迟之后被asynchronous调用,所以你应该在块中进行处理,或者调用块中的另一个方法来处理。

块中的代码是asynchronous运行的。 因此,块之后的代码在块中的代码有机会运行之前运行(或至less肯定完成)。

请参阅developer.apple.com上的本教程使用块