GMSGeoCoder reverseGeocodeCoordinate:completionHandler:在后台线程上
Posted
技术标签:
【中文标题】GMSGeoCoder reverseGeocodeCoordinate:completionHandler:在后台线程上【英文标题】:GMSGeoCoder reverseGeocodeCoordinate: completionHandler: on background thread 【发布时间】:2016-02-16 13:33:06 【问题描述】:我需要从 2 个坐标中获取城市名称(我正在使用 GMSGeoCoder
-reverseGeocodeCoordinate: completionHandler:
方法),然后对对象进行比较。
问题是该方法在后台线程上运行(而不是在主线程中),当我尝试比较(使用if
语句)对象(userCity
和storeCity
-两者都是NSString
) 仍然为零。
我的代码:
//Checking user's city
__block NSString *userCity;
[[GMSGeocoder geocoder]reverseGeocodeCoordinate:self.locationManager.location.coordinate completionHandler:^(GMSReverseGeocodeResponse *response, NSError *error)
if (error)
NSLog(@"%@",[error description]);
userCity=[[[response results] firstObject] locality];
];
//Checking store's city
__block NSString *storeCity;
[[GMSGeocoder geocoder]reverseGeocodeCoordinate:arounder.radiusCircularRegion.center completionHandler:^(GMSReverseGeocodeResponse *response, NSError *error)
if (error)
NSLog(@"%@",[error description]);
arounderCity=[[[response results] firstObject] locality];
];
if ([userCity isEqualToString:arounderCity])
return YES;
有什么想法吗?谢谢!
【问题讨论】:
是的,等待块然后继续! @Daij-Djan 这基本上就是我想做的,但我该怎么做呢?可以给我一个代码示例吗? 我写了一个。请注意我是内联写的,可能有较小的错别字,但它会给你逻辑 【参考方案1】:在异步任务完成后重组您的代码以继续:
这还有一个好处是你不会主动等待东西并阻塞主线程
例如:
- (void)checkCitiesWithCompletionBlock:(void (^)(BOOL same))
//Checking user's city
[[GMSGeocoder geocoder]reverseGeocodeCoordinate:self.locationManager.location.coordinate completionHandler:^(GMSReverseGeocodeResponse *response, NSError *error)
if (error)
NSLog(@"%@",[error description]);
id userCity=[[[response results] firstObject] locality];
//Checking store's city
[[GMSGeocoder geocoder]reverseGeocodeCoordinate:arounder.radiusCircularRegion.center completionHandler:^(GMSReverseGeocodeResponse *response, NSError *error)
if (error)
NSLog(@"%@",[error description]);
id arounderCity=[[[response results] firstObject] locality];
same ([userCity isEqualToString:arounderCity]);
];
];
【讨论】:
我将在返回 BOOL 的函数上调用-checkCitiesWithCompletionBlock:
,我应该在完成之外返回什么?
如果你愿意.. 我不建议这样做.. 等待块完成。但是外部 api 也应该是异步的 IMO。如何等待我之前也在 SO 上回答过的问题,这可能会对您有所帮助:)以上是关于GMSGeoCoder reverseGeocodeCoordinate:completionHandler:在后台线程上的主要内容,如果未能解决你的问题,请参考以下文章
html JS.Geolocate.ReverseGeocoding
Swift ReverseGeocode CLPlacemark areaOfInterest 几乎总是为零。我应该使用别的东西吗?