我知道它与锁或调度组有关,但我似乎无法编码...
在离开方法之前,我需要知道地址是否是有效地址。目前线程只是溢出并返回TRUE。我试过锁,调度工程,但似乎无法正确。任何帮助表示赞赏:
- (BOOL) checkAddressIsReal
{
__block BOOL result = TRUE;
// Lets Build the address
NSString *location = [NSString stringWithFormat:@" %@ %@, %@, %@, %@", streetNumberText.text, streetNameText.text, townNameText.text, cityNameText.text, countryNameText.text];
// Put a pin on it if it is valid
CLGeocoder *geocoder = [[CLGeocoder alloc] init];
[geocoder geocodeAddressString:location
completionHandler:^(NSArray* placemarks, NSError* error) {
result = [placemarks count] != 0;
}];
return result;
}
答案 0 :(得分:0)
文档说明CLGeocoder
在主线程上调用completionHandler
。由于您可能还在主线程中调用方法,因此无法等待地理编码器的答案,而不会给它提供结果的机会。
这可以通过轮询runloop来完成,使用一些API作为-[NSRunLoop runMode:beforeDate:]
。
缺点是,根据模式,这也会在等待结果时传递事件和火警计时器。
答案 1 :(得分:0)
只需使用block作为参数:
- (void) checkAddressIsRealWithComplectionHandler:(void (^)(BOOL result))complectionHandler
{
__block BOOL result = TRUE;
// Lets Build the address
NSString *location = [NSString stringWithFormat:@" %@ %@, %@, %@, %@", streetNumberText.text, streetNameText.text, townNameText.text, cityNameText.text, countryNameText.text];
// Put a pin on it if it is valid
CLGeocoder *geocoder = [[CLGeocoder alloc] init];
[geocoder geocodeAddressString:location
completionHandler:^(NSArray* placemarks, NSError* error) {
result = [placemarks count] != 0;
complectionHandler(result);
}];
}