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#>)
答案 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中通常的模式是如果找不到合适的结果,结果将是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];