블록이이 시나리오에서 정확히 어떻게 작동하는지 이해하지 못합니다. 블록을 마친 후 CLGeocoder에서 위치를 가져오고 MKPlacemark를 저장하려고합니다. 따라서이 방법에서 :변수가 블록 내에 설정 한 후에 null입니다.
- (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를 반환하면 코드에서 다른 값을 사용할 수 있습니까? 감사.
귀하의'place' 변수가 nil이 될 수 없다을 위치 표시가 반환되어 if 문을 입력하지 마십시오. if 문 내부에 중단 점을 설정하고 실행되는지 확인 했습니까? –