あなたのデザインは間違っています。
非同期呼び出しを実行しているため、メソッドで値を同期的に返すことはできません。
これcompletionHandler
は、将来いつか呼び出されるブロックであるため、ブロックが呼び出されたときに結果を処理するようにコードの構造を変更する必要があります。
たとえば、コールバックを使用できます。
- (void)findCityOfLocation:(CLLocation *)location {
geocoder = [[CLGeocoder alloc] init];
typeof(self) __weak weakSelf = self; // Don't pass strong references of self inside blocks
[geocoder reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error) {
if (error || placemarks.count == 0) {
[weakSelf didFailFindingPlacemarkWithError:error];
} else {
placemark = [placemarks objectAtIndex:0];
[weakSelf didFindPlacemark:placemark];
}
}];
}
- (void)didFindPlacemark:(CLPlacemark *)placemark {
// do stuff here...
}
- (void)didFailFindingPlacemarkWithError:(NSError *)error {
// handle error here...
}
またはブロック(私が通常好む)
- (void)findCityOfLocation:(CLLocation *)location completionHandler:(void (^)(CLPlacemark * placemark))completionHandler failureHandler:(void (^)(NSError *error))failureHandler {
geocoder = [[CLGeocoder alloc] init];
[geocoder reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error) {
if (failureHandler && (error || placemarks.count == 0)) {
failureHandler(error);
} else {
placemark = [placemarks objectAtIndex:0];
if(completionHandler)
completionHandler(placemark);
}
}];
}
//usage
- (void)foo {
CLLocation * location = // ... whatever
[self findCityOfLocation:location completionHandler:^(CLPlacemark * placemark) {
// do stuff here...
} failureHandler:^(NSError * error) {
// handle error here...
}];
}