Я хочу ждать задача асинхронной закончить (получение обратный результат геокодирования), поэтому я использую блоки, как следующим образом: метод будет выполняться [self.dataArray count]
раз:Подождите, пока блок достигнет своего блока завершения
for (Trip_ObjC *trip in self.dataArray) {
NSData *tripData = [trip.coordinates dataUsingEncoding:NSUTF8StringEncoding];
NSArray *coordinatesArray = [NSJSONSerialization JSONObjectWithData:tripData options:NSJSONReadingMutableContainers error:&error];
[self prepareDistanceAndTimeArray:trip andCoordinates:coordinatesArray];
[self prepareMapRoutes:trip andCoordinates:coordinatesArray];
[self prepareDates:trip];
//HERE IS THE TARGETTED METHOD
NSLog(@"entered");
[self getAddressFromTrip:trip andCoordinates:coordinatesArray completionHandler:^{
NSLog(@"GOT ADDRESS");
}];
}
Тогда это декларация getAddressFromTrip
-(void)getAddressFromTrip:(Trip_ObjC*)trip andCoordinates:(NSArray*)tripArray completionHandler:(void (^)(void))completionHandler{
NSLog(@"getAddressFromTrip with ID %d",trip.id_);
//Got userLocationBegin
// GOT userLocationEnd
[self geocodeLocation:userLocationBegin andUserLocationEnd:userLocationEnd andTripId:trip.id_ completionHandler:^{
if (completionHandler) {
NSLog(@"completionHandler");
completionHandler();
}
}];
}
Теперь вот проблема, это не просто введите reverseGeocodeCoordinate
блок и выполнить код, я просто результат прошлого цикла:
-(void)geocodeLocation:(CLLocation*)userLocationBegin andUserLocationEnd:(CLLocation*)userLocationEnd andTripId:(int)tripId completionHandler:(void (^)(void))completionHandler {
NSLog(@"geocodeLocation with ID %d",tripId);
CLLocationCoordinate2D c2dBegin=CLLocationCoordinate2DMake(userLocationBegin.coordinate.latitude, userLocationBegin.coordinate.longitude);
__block NSString *addressBegin;
NSLog(@"Before entrering geocoding block");
[[LMGeocoder sharedInstance] reverseGeocodeCoordinate:c2dBegin
service:kLMGeocoderGoogleService
completionHandler:^(LMAddress *address, NSError *error) {
if (address && !error) {
NSLog(@"trip.id_ %d",tripId);
addressBegin=[NSString stringWithFormat:@"%@ ,%@",address.administrativeArea,address.locality];
if(completionHandler){
completionHandler();
}
}
else {
NSLog(@"Error reverse: %@", error.description);
}
}];
}
LOG:
2014-12-04 16:51:09.435 GOTTIZ[18710:2151731] entered
2014-12-04 16:51:09.436 GOTTIZ[18710:2151731] getAddressFromTrip with ID 11
2014-12-04 16:51:09.436 GOTTIZ[18710:2151731] geocodeLocation with ID 11
2014-12-04 16:51:09.436 GOTTIZ[18710:2151731] Before entrering geocoding block
2014-12-04 16:51:09.436 GOTTIZ[18710:2151731] entered
2014-12-04 16:51:09.436 GOTTIZ[18710:2151731] getAddressFromTrip with ID 13
2014-12-04 16:51:09.436 GOTTIZ[18710:2151731] geocodeLocation with ID 13
2014-12-04 16:51:09.437 GOTTIZ[18710:2151731] Before entrering geocoding block
2014-12-04 16:51:09.437 GOTTIZ[18710:2151731] entered
2014-12-04 16:51:09.437 GOTTIZ[18710:2151731] getAddressFromTrip with ID 14
2014-12-04 16:51:09.437 GOTTIZ[18710:2151731] geocodeLocation with ID 14
2014-12-04 16:51:09.438 GOTTIZ[18710:2151731] Before entrering geocoding block
2014-12-04 16:51:09.438 GOTTIZ[18710:2151731] entered
2014-12-04 16:51:09.438 GOTTIZ[18710:2151731] getAddressFromTrip with ID 9
2014-12-04 16:51:09.438 GOTTIZ[18710:2151731] geocodeLocation with ID 9
2014-12-04 16:51:09.438 GOTTIZ[18710:2151731] Before entrering geocoding block
2014-12-04 16:51:09.438 GOTTIZ[18710:2151731] entered
2014-12-04 16:51:09.439 GOTTIZ[18710:2151731] getAddressFromTrip with ID 1
2014-12-04 16:51:09.439 GOTTIZ[18710:2151731] geocodeLocation with ID 1
2014-12-04 16:51:09.439 GOTTIZ[18710:2151731] Before entrering geocoding block
2014-12-04 16:51:09.536 GOTTIZ[18710:2151731] trip.id_ 1
2014-12-04 16:51:09.852 GOTTIZ[18710:2151731] addressBegin
2014-12-04 16:51:09.852 GOTTIZ[18710:2151731] addressEnd
2014-12-04 16:51:09.852 GOTTIZ[18710:2151731] completionHandler
2014-12-04 16:51:09.852 GOTTIZ[18710:2151731] GOT ADDRESS
2014-12-04 16:51:09.862 GOTTIZ[18710:2151731] addressBegin
2014-12-04 16:51:09.862 GOTTIZ[18710:2151731] addressEnd
2014-12-04 16:51:09.862 GOTTIZ[18710:2151731] completionHandler
2014-12-04 16:51:09.862 GOTTIZ[18710:2151731] GOT ADDRESS
2014-12-04 16:51:09.880 GOTTIZ[18710:2151731] addressBegin
2014-12-04 16:51:09.880 GOTTIZ[18710:2151731] addressEnd
2014-12-04 16:51:09.880 GOTTIZ[18710:2151731] completionHandler
2014-12-04 16:51:09.881 GOTTIZ[18710:2151731] GOT ADDRESS
2014-12-04 16:51:09.894 GOTTIZ[18710:2151731] addressBegin
2014-12-04 16:51:09.895 GOTTIZ[18710:2151731] addressEnd
2014-12-04 16:51:09.895 GOTTIZ[18710:2151731] completionHandler
2014-12-04 16:51:09.895 GOTTIZ[18710:2151731] GOT ADDRESS
2014-12-04 16:51:10.023 GOTTIZ[18710:2151731] addressBegin
2014-12-04 16:51:10.023 GOTTIZ[18710:2151731] addressEnd
2014-12-04 16:51:10.023 GOTTIZ[18710:2151731] completionHandler
2014-12-04 16:51:10.023 GOTTIZ[18710:2151731] GOT ADDRESS
Вы можете заметить, что это не входит в reverseGeocodeCoordinate
блок и продолжает цикл до последнего элемента и его отображения. И то, что trip.id_
отображается только один раз. Я не знаю, как он на самом деле продолжает цикл, даже если он не получает completeHandler().
просто хотел заметить, что если вы сделаете так много запросов сразу, Google заблокирует вас довольно быстро. – Daniel
@simpleBob: Итак, каков наилучший подход к обратному геокодированию? Спасибо . – androniennn
используйте кеширование, сохраните все уже сделанные запросы и попытайтесь отправить как можно меньше запросов. – Daniel