2013-08-08 2 views
0

Google지도 SDK에 이러한 콜백을 사용하는 메소드가 있습니다. 블럭이라고 생각합니까? 어쨌든 나는 전에 이것을 사용한 적이 없다. requestPanoramaNearCoordinate 메소드가 유효한 파노라마 근처의 유효한 파노라마를 반환하는지 확인하고 싶습니다. 콜백을 사용하여 콜백이 반환하는 것을 확인하려면 어떻게해야합니까? 유효한 위치가Obj-C : 콜백 사용

- (void) requestPanoramaNearCoordinate: (CLLocationCoordinate2D)coordinate 
           callback: (GMSPanoramaCallback)callback 

지정된 좌표 근처의 파노라마에 대한 정보를 검색 찾을 때까지 방법을 반복적으로 거 야 호출 할 경우 - 그것은에서 유효한 파노라마를 반환하면 내가 그것을 반환 할 좌표입니다. 이 은 비동기 요청이므로 콜백이 결과와 함께 호출됩니다.

CLLocationCoordinate2D ranLatLng = CLLocationCoordinate2DMake(ranLatitude, ranLongitude); 

if ([panoService requestPanoramaNearCoordinate:ranLatLng callback:<#^(GMSPanorama *panorama, NSError *error)callback#>) 
+0

무엇이 문제입니까? –

+0

나는 –

+0

이라는 문제를 명확히했다. 아직도 명확하지 않다. 콜백이 "콜백 (call back)"되는 함수를 얻으려고합니까? –

답변

1

그것은 블록입니다. 당신은 API 호출과 같이합니다 재귀 할

[aPanoramaService requestPanoramaNearCoordinate:aCoordiante callback:^(GMSPanorama *panorama, NSError *error) { 
    NSLog(@"the service returned a panorama=%@ and an error=%@", panorama, error); 
}]; 

한 가지 방법은 구글 방법과 유사한 서명 방법을 구축하는 것입니다. 중요한 점은 재귀가 멈출 수있는 방법을 찾아내는 것입니다. 아마도 검색에 질려 버릴 수도 있기 때문입니다. 전화

- (void)findPanoramaAtLocation:(CLLocationCoordinate2D)location withCompletion:(void (^)(GMSPanorama *, NSError *))completion { 

    [self.panoramaService requestPanoramaNearCoordinate:location callback:^(GMSPanorama *panorama, NSError *error) { 
     if (error) { 
      completion(nil, error); 
     } else if (panorama) { 
      completion(panorama, nil); 
     } else { 

      if (/* should we continue searching? */) { 

       // compute a new location to try 
       double latitude = // compute new latitude 
       double longitude = // compute new longitude 
       CLLocationCoordinate2D newLocation = CLLocationCoordinate2DMake(latitude, longitude); 

       [self findPanoramaAtLocation:newLocation withCompletion:completion]; 

      } else { 
       // no panorama and no error means we gave up 
       completion(nil, nil); 
      } 
     } 
    }]; 
} 

이 실행의 오류가 발생하면 (이 블록의) 파노라마 위치를 찾을 때 중, "콜백", 또는 당신의 논리는 검색을 중지한다고 판단하는 경우.

1

panorama 매개 변수는 요청한 사용자가 발견 한 GMSPanorama 개체를 포함합니다. Cocoa의 일반적인 패턴은 적절하지 않은 것이 발견되면 nil이고 NSError 개체는 이유에 대한 정보를 줄 것입니다. 요청을 다시 작성하면 다음과 같이 보일 것입니다.

// Necessary if GMSPanoService is ill-behaved and keeps the Block 
// around after calling it. 
__weak GMSPanoramaService weak_panoService = panoService; 

__block GMSPanoramaCallback cb; 
cb = [^(GMSPanorama *panorama, NSError *error){ 
    if(!panorama){ 
     // Do something with error if desired 
     CLLocationCoordinate2D newLatLng = /* Calc new coordinates somehow */; 
     [/*weak_*/panoService requestPanoramaNearCoordinate:newLatLng 
              callback:cb]; 
    } 
    else { 
     // Got a panorama, do something with it 
     cb = nil; // Release Block 
    } 
} copy]; 

[panoService requestPanoramaNearCoordinate:ranLatLng 
            callback:cb]; 
+0

생성 할 수 있다고 생각합니다. panoService의주기를 유지합니다. – danh

+0

블록 자체의 보관주기가 실제로 문제가되는 것입니다. 나는이 일을 제대로하지 않았다. –

+0

예, panoService 보유주기가 고정됩니다. 더 정확한 관용구가 __unsafe_unreatined라고 생각합니다. – danh