Obj-C:回调的使用

时间:2013-08-08 22:25:23

标签: objective-c callback

Google Maps SDK中有一种使用这类回调的方法,我想这是块?无论如何我以前从未使用过这些。我只是想看看方法requestPanoramaNearCoordinate是否在我给它的坐标附近返回一个有效的Panorama。我如何使用回调来查看回调返回的内容?如果它在我想要返回的坐标处返回一个有效的Panorama - 如果不是,我将递归调用该方法,直到找到一个有效的位置

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

检索有关给定坐标附近的全景的信息。这个   是一个异步请求,将使用结果调用回调。

CLLocationCoordinate2D ranLatLng = CLLocationCoordinate2DMake(ranLatitude,  ranLongitude);

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

2 个答案:

答案 0 :(得分:1)

这是一个块。你做这样的api调用:

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

进行递归的一种方法是构建一个与google方法具有类似签名的方法。重要的一点是找到一种方法让递归停止,可能是因为你厌倦了搜索。

- (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 :(得分:1)

panorama参数包含请求为您找到的GMSPanorama对象。它似乎没有被非常清楚地记录,但是Cocoa中通常的模式是如果找不到合适的结果,结果将是nilNSError对象将为您提供一些信息为什么。至于重新制作请求,我想这看起来像这样:

// 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];