使用reverseGeocodeLocation设置地址string:并从方法返回

我尝试本地化一个地址string的开始和结束点,以便我可以将其存储到NSUserDefaults 。 问题是该方法继续执行,并没有设置我的variables。

 NSLog(@"Begin"); __block NSString *returnAddress = @""; [self.geoCoder reverseGeocodeLocation:self.locManager.location completionHandler:^(NSArray *placemarks, NSError *error) { if(error){ NSLog(@"%@", [error localizedDescription]); } CLPlacemark *placemark = [placemarks lastObject]; startAddressString = [NSString stringWithFormat:@"%@ %@\n%@ %@\n%@\n%@", placemark.subThoroughfare, placemark.thoroughfare, placemark.postalCode, placemark.locality, placemark.administrativeArea, placemark.country]; returnAddress = startAddressString; //[self.view setUserInteractionEnabled:YES]; }]; NSLog(returnAddress); NSLog(@"Einde"); 

这是我的应用程序debugging器显示的内容:

开始
einde

例如,如果我的位置的地址是“Mainstreet 32​​,CITY”。 那么我想看到的是以下几点:

开始
Mainstreet 32​​,CITY
Einde

问题是,我的代码不会等待我的CLGeocoder完成,所以返回时,我的variablesreturnAddress没有设置,它是空的。

有谁知道如何解决这个问题?

因为reverseGeocodeLocation有一个完成块,所以在执行到达时它会被切换到另一个线程 – 但是主线程的执行仍然会继续到下一个操作,即NSLog(returnAddress) 。 在这一点上, returnAddress还没有被设置,因为reverseGeocodeLocation只是被递交给另一个线程。

当使用完成块时,您将不得不开始考虑asynchronous工作。

考虑将reverseGeocodeLocation作为方法中的最后一个操作,然后用完成块内的其余逻辑调用新方法。 这将确保逻辑不会执行,直到你有一个returnAddress的值。

 - (void)someMethodYouCall { NSLog(@"Begin"); __block NSString *returnAddress = @""; [self.geoCoder reverseGeocodeLocation:self.locManager.location completionHandler:^(NSArray *placemarks, NSError *error) { if(error){ NSLog(@"%@", [error localizedDescription]); } CLPlacemark *placemark = [placemarks lastObject]; startAddressString = [NSString stringWithFormat:@"%@ %@\n%@ %@\n%@\n%@", placemark.subThoroughfare, placemark.thoroughfare, placemark.postalCode, placemark.locality, placemark.administrativeArea, placemark.country]; returnAddress = startAddressString; //[self.view setUserInteractionEnabled:YES]; NSLog(returnAddress); NSLog(@"Einde"); // call a method to execute the rest of the logic [self remainderOfMethodHereUsingReturnAddress:returnAddress]; }]; // make sure you don't perform any operations after reverseGeocodeLocation. // this will ensure that nothing else will be executed in this thread, and that the // sequence of operations now follows through the completion block. } - (void)remainderOfMethodHereUsingReturnAddress:(NSString*)returnAddress { // do things with returnAddress. } 

或者,您可以使用NSNotificationCenter在reverseGeocodeLocation完成时发送通知。 您可以在任何需要的地方订阅这些通知,并从那里完成逻辑。 replace[self remainderOfMethodHereWithReturnAddress:returnAddress]; 有:

 NSDictionary *infoToBeSentInNotification = [NSDictionary dictionaryWithObject:returnAddress forKey:@"returnAddress"]; [[NSNotificationCenter defaultCenter] postNotificationName:@"NameOfNotificationHere" object:self userInfo: infoToBeSentInNotification]; }]; 

这里是一个使用NSNotificationCenter的例子。