等待异步执行块完成

时间:2014-07-10 10:26:38

标签: ios asynchronous objective-c-blocks

我有一个简单的问题......我希望解决方案也很简单!

这是我的代码:

__block NSString * response; //the result !

[deviceInfo.geocoder reverseGeocodeLocation:deviceInfo.locationProperties completionHandler:

 ^(NSArray *placemarks, NSError *error) {

     [placemarks copy];
     //Get nearby address
     CLPlacemark *placemark = [placemarks objectAtIndex:0];

     NSLog(@"Country : %@",placemark.country);
     response =placemark.country;
 }
 ];

//-----------------------------------------------
NSLog(@"Response COUNTRY : %@",response); // response = NULL /!\

在该区块内,placemark.country等于UK

我怎么能在街区之外有response = placemark.country

1 个答案:

答案 0 :(得分:0)

在运行NSLog行的位置,尚未调用完成块。 reverseGeocodeLocation是一个非阻塞调用,这就是它需要一个完成处理程序的原因。

您不想做的是将其转换为同步方法。我认为你想要更新你的UI以响应地理编码的完成。做这样的事情:

我看不出“[placemarks copy]”行应该达到的目的。这完全没有意义,因为你忽略了返回值。

[deviceInfo.geocoder reverseGeocodeLocation:deviceInfo.locationProperties completionHandler:

 ^(NSArray *placemarks, NSError *error) {

     [placemarks copy];
     //Get nearby address
     CLPlacemark *placemark = [placemarks objectAtIndex:0];

     NSLog(@"Country : %@",placemark.country);
     // No need for response to be a __block variable.
     NSString *response =placemark.country;
     dispatch_async(dispatch_get_main_queue(), ^{
       [self updateUIWithResponse:response];
    }
 ];

 -(void)updateUIWithResponse:(NSString*)response
 {
     NSLog(@"Got a response: %@), response);
 }