2012-05-11 6 views
3

블록이이 시나리오에서 정확히 어떻게 작동하는지 이해하지 못합니다. 블록을 마친 후 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를 반환하면 코드에서 다른 값을 사용할 수 있습니까? 감사.

+0

귀하의'place' 변수가 nil이 될 수 없다을 위치 표시가 반환되어 if 문을 입력하지 마십시오. if 문 내부에 중단 점을 설정하고 실행되는지 확인 했습니까? –

답변

1

"장소"를 유지하려면 자체에 ivar/속성을 만듭니다 (자기가 무엇이든). 그것을 __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); 

} 
+0

내가 그 대신에 그 방법을 돌려 주어야하는 이유는 무엇인가? – Crystal

+1

placeMarkFromString은 비동기 메서드이기 때문에. 메서드에서 "반환"하려는 경우 위의 편집을 참조하십시오. – Joel

관련 문제