2012-12-17 2 views
0

사용자의 상태를 반환하려고합니다. reverseGeocodeLocation을 사용해야 함을 이해합니다.reverseGeocodeLocation을 사용하여 NSString으로 사용자 상태 반환

- (NSString *)getUserLatitude 
{ 
NSString *userLatitude = [NSString stringWithFormat:@"%f", 
locationManager.location.coordinate.latitude]; 
return userLatitude; 
} 

나는 현재이 코드를 가지고 있지만, 나는 그것이 동작하지 않습니다 : 나는 아래의 사용자의 위도를 반환하고 같은 방법으로있는 NSString으로 상태를 반환하고 싶습니다. 내가 (무효)를 사용하고 있기 때문일 수 있습니다. 나는 조금 잃었다.

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation 
*)newLocation fromLocation:(CLLocation *)oldLocation { 

CLGeocoder * geoCoder = [[CLGeocoder alloc] init]; 
[geoCoder reverseGeocodeLocation:newLocation completionHandler:^(NSArray *placemarks, 
NSError *error) { 
    for (CLPlacemark * placemark in placemarks) { 
     NSString *userState = [placemark locality]; 

    return userState; 

    } 
}]; 
} 

누구나 아이디어가 있습니까? 고맙습니다!

답변

0

완료 블록에서 검색된 지역 정보로 무엇인가를해야합니다. 이 코드는 void 반환과 함께 메서드가 반환 된 후 오랫동 안 비동기 적으로 실행됩니다.

일반적으로 검색된 정보를 전달하는보기 컨트롤러 나 모델 클래스에서 일종의 메서드를 호출합니다.

return userState을 바꾸면 블록의 반환 유형과 일치하지 않습니다. 어떻게이 asynchnonicity의 작품을 감상 할 수 있도록

[myViewController didFinishGettingState:userState];

당신은 블록과 GCD 기초로 보일 것입니다 :

대신 같은 것을 넣어.

0

아마도 completionHandler의 작동 방식을 이해하지 못했을 것입니다. reverseGeocodeLocation:completionHandler:은 룩업이 완료되고 placemarkserror 매개 변수로 호출 될 때 실행되는 함수 인 핸들러를 사용합니다.

당신이해야 할 일은 그 블록에서 의미있는 것을 수행하는 것입니다. 물론 우리가

- (void)didFailRetrievingUserState:(NSError *)error { 
    // Show error 
} 

- (void)didFinishRetrievingUserStates:(NSArray *)userStates { 
    // Do something reasonable with the multiple possible values 
} 

- (void)didFinishRetrievingUserState:(NSString *)userState { 
    // Do something reasonable with the only result you have 
} 
위의 블록에서 호출하는 세 가지 방법을 구현해야 다음

[geoCoder reverseGeocodeLocation:newLocation completionHandler:^(NSArray *placemarks, NSError *error) { 
    if (error != nil) { 
     // Something bad happened... 
     [self didFailRetrievingUserState:error]; 
    } else { 
     // Check whether the placemark retrieved is unique 
     if (placemarks.count > 1) { 
      NSMutableArray * states = [NSMutableArray array]; 
      for (CLPlacemark * placemark in placemarks) { 
       NSString * userState = [placemark locality]; 
       [states addObject:userState]; 
      } 
      [self didFinishRetrievingUserStates:states]; 
     } else { 
      [self didFinishRetrievingUserState:[placemarks[0] locality]]; 
     } 
    } 
}]; 

을 다음과 같이 내가 어떤 오류가 발생 여부를 확인 시작할 것이라고, 그때는 실패 또는 성공하는 방법을 부를 것

분명히 위의 코드는 제안 사항입니다. 핸들러 블록 내부의 모든 로직을 처리하거나 고유/고유하지 않은 경우를 구별하지 않는 것과 같이 다른 결정을 내릴 수 있습니다.

일반적으로 핸들러 블록이 void 기능이므로 아무 것도 반환하지 않아야한다는 것을 이해하는 것이 중요합니다. 그것은 단지 무언가를하기로되어 있으며,이 예제는 예제에 정의 된대로 "위임"메소드를 호출 할 수 있습니다.

관련 문제