如何访问已在块内分配的对象?

时间:2014-06-16 13:13:14

标签: ios objective-c block

我想为两个字符串赋值,然后在块外使用它们,或者作为另一个类中的属性。但我得到Null作为回报。

这是代码:

__block NSString* citySTR = nil;
__block NSString* countrySTR = nil;

[geocoder reverseGeocodeLocation:locationManager.location completionHandler:
 ^(NSArray* placemarks, NSError* error){
     if ([placemarks count] > 0)
     {
         citySTR = [[placemarks objectAtIndex:0] administrativeArea];
         countrySTR = [[placemarks objectAtIndex:0] country];
     }
 }];

当我NSLog citySTR和countrySTR在该区块之外时,我得到Null

3 个答案:

答案 0 :(得分:1)

这只是一个时间问题,因为当reverseGeocodeLocation:返回竞争处理程序块时尚未执行,因为该方法是异步运行的(我怀疑是语义)。

你可能想在完成处理程序中调用另一个方法来使用这些值,但是我不知道你想要对这些值做什么,所以我无法在这方面提供适当的帮助。

答案 1 :(得分:1)

之后你想对这些值做什么? 如果要设置标签或调用其他类方法,可以在块内完成。 另一种解决方案是委托/添加观察者:

 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(somethingHappens:) name:@"notificationName" object:nil]; - this one suppose to listen do the event (called at the initialisation)

并且这个调用它:

 [[NSNotificationCenter defaultCenter] postNotificationName:@"notificationName" object:obj];

您可以将citySTR和countrySTR作为属性 - 也许可以提供帮助

答案 2 :(得分:1)

其他人已经暗示了你的问题,但让我们清楚地说出来。

地理编码方法reverseGeocodeLocation是异步调用。您说“在后台查找此位置,一旦您有答案,请运行以下代码。”

该方法立即返回,并在程序继续运行时开始在后台处理您的请求。 reverseGeocodeLocation方法必须通过网络发送请求,等待远程服务器(可能同时处理数千个其他请求),然后解析它返回的响应。可能需要几秒钟(或更长时间)才能返回,同时您的程序继续正常运行。

这就像在你的开胃菜到来之后在餐厅为服务员订购主菜。如果您下订单然后将叉子放在盘子上,期望主菜在那里立即出现,那么您会感到失望。你需要等到服务员在一段不同的时间后给你带来食物。在此期间,您可以继续吃开胃菜。

如果您的代码假定您在进行reverseGeocodeLocation调用后立即执行,则citySTR和countrySTR将包含您所在位置的值,但不会。请记住,reverseGeocodeLocation会在结果准备好之前立即返回。

reverseGeocodeLocation方法会保存您提供的完成块。一旦得到答案,它就会调用完成块代码。

您应该将代码放在完成块中处理生成的地标列表。完成块代码可以将消息传递给其他对象,它可以在标签中设置显示信息,(在当前视图控制器中)等。