このシナリオでブロックがどのように機能するかを正確に理解していないと思います。CLGeocoderから場所を取得し、ブロックが終了した後にMKPlacemarkを保存しようとしています。したがって、この方法では:
- (MKPlacemark *)placeMarkFromString:(NSString *)address {
CLGeocoder *geocoder = [[CLGeocoder alloc] init];
__block MKPlacemark *place;
[geocoder geocodeAddressString:address completionHandler:^(NSArray *placemarks, NSError *error) {
[placemarks enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
NSLog(@"%@", [obj description]);
}];
// Check for returned placemarks
if (placemarks && [placemarks count] > 0) {
CLPlacemark *topResult = [placemarks objectAtIndex:0];
// Create an MKPlacemark and add it to the mapView
place = [[MKPlacemark alloc] initWithPlacemark:topResult];
[self.mapView addAnnotation:place];
}
if (error) {
NSLog(@"Error: %@", [error localizedDescription]);
}
}];
NSLog(@"%@", [place description]);
return place;
}
コードを実行すると、MKPlacemarkの場所がマップに追加されます。ただし、値をログに記録すると、NULLになります。ブロックがすぐに実行されないためかもしれませんか?したがって、NSLogが最初に実行され、次にcompletionHandlerが実行される可能性があります。ただし、コードの他の場所でその値を使用できるように、このメソッドからMKPlacemarkを返すにはどうすればよいですか?ありがとう。