我不认为我理解块在这种情况下是如何工作的。我正试图从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,以便我可以在代码中的其他位置使用该值?感谢。
答案 0 :(得分:1)
如果你想保留“地方”,为自己创造一个ivar / property(无论是什么)。将其声明为__block变量。然后做:
self.place = [[MKPlacemark alloc] initWithPlacemark:topResult];
如果你想跟踪多个地方,你可以创建一个NSArray ivar,然后每次执行该块时只需将对象添加到数组中。
是的,你的NSLog(@“%@”,[地方描述]);将在块执行之前运行。
编辑:如果你想从这个方法中“返回”,你需要使你的方法成为块方法:
typedef void (^SuccessBlock)(id);
typedef void (^FailureBlock)(NSError *);
- (void)placeMarkFromString:(NSString *)address withSuccess:(SuccessBlock)success andFailure:(FailureBlock)failure {
... //inside the enumerateObjectsUsingBlock block
success(place);
...
failure(error);
}