我想從座標中找到用戶的位置以保存到我的數據庫中。塊直到反向地址碼已經返回
查找我正在使用的位置名稱reverseGeocode。然而,由於它是一個塊方法,我的self.locationName將返回(並保存爲零)到數據庫中。所以我試圖找到問題的解決方案,並嘗試使用信號量將以下解決方案放在一起嘗試並阻止,直到我找到可以保存的位置名稱,但應用程序僅在按下保存按鈕時掛起。我是否應該以這種方式解決這個問題,還是有更好的方法?
dispatch_semaphore_t semaphore;
- (void)reverseGeocode:(CLLocation *)location {
CLGeocoder *geocoder = [[CLGeocoder alloc] init];
[geocoder reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error) {
NSLog(@"Finding address");
if (error) {
NSLog(@"Error %@", error.description);
} else {
CLPlacemark *placemark = [placemarks lastObject];
self.locationName = [NSString stringWithFormat:@"%@", ABCreateStringWithAddressDictionary(placemark.addressDictionary, NO)];
dispatch_semaphore_signal(semaphore);
}
}];
}
-(NSString *)findLocation:(CLLocation *)startingLocation
{
semaphore = dispatch_semaphore_create(0);
[self reverseGeocode:startingLocation];
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); //should maybe timeout
return self.locationName;
}
重做你的代碼,以便代替'findLocation:'返回一個字符串,讓它代替一個塊,然後你可以調用你的反向地理編碼方法完成。該塊將處理保存數據庫中的位置名稱。 – Gavin
爲了擴展Gavin的答案,幾乎從來沒有正確的方法來進行同步網絡(或其他長時間運行的進程)調用。 –
謝謝你的建議@Gavin。當我開始思考信號量時,我知道我正在嘗試創建一個解決方法! – Sarah92