0

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

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

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

CLLocationCoordinate2D ranLatLng = CLLocationCoordinate2DMake(ranLatitude,  ranLongitude);

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

2 回答 2

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];
于 2013-08-08T22:51:00.937 回答
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);
            }
        }
    }];
}

这将运行,当找到全景位置、发生错误或您的逻辑确定它应该停止搜索时调用“回调”(它是一个块)。

于 2013-08-08T22:50:00.720 回答