Я пытаюсь найти местоположение пользователя по координате для сохранения в моей базе данных.
Чтобы найти название местоположения, я использую reverseGeocode. Однако, поскольку это блочный метод, мой self.locationName вернется (и сохранится как nil) в базу данных. Итак, я попытался найти решение проблемы и попытался собрать следующее решение, используя семафоры, чтобы попытаться заблокировать, пока я не получу имя местоположения, которое я могу сохранить, но приложение просто зависает при нажатии кнопки сохранения. Должен ли я даже решать эту проблему таким образом или есть лучший способ?
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:
возвращаемой строки он вместо этого принимал блок, который вы затем можете вызвать после завершения метода обратного геокодирования. Этот блок будет обрабатывать сохранение имени местоположения в вашей базе данных. - person Gavin   schedule 28.02.2014