我想为两个字符串赋值,然后在块外使用它们,或者作为另一个类中的属性。但我得到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
。
答案 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方法会保存您提供的完成块。一旦得到答案,它就会调用完成块代码。
您应该将代码放在完成块中处理生成的地标列表。完成块代码可以将消息传递给其他对象,它可以在标签中设置显示信息,(在当前视图控制器中)等。