Отправить запрос NSURLConnection несколько раз с разными URL-адресами в цикле for

У меня есть массив адресов, которые мне нужно преобразовать в Lat / Long с помощью Google Geocode api. Я загружаю адрес и город в URL-адрес Google Geocode, который формирует правильный URL-адрес соединения.

В основном я хочу иметь возможность использовать цикл for для создания нескольких запросов NSURLConnection, возвращая несколько ответов.

-(void)setString{ for (int i = 0; i < [businessArray count]; i ++) { NSString *address = [addressArray objectAtIndex:0]; NSString *city = [locationDict valueForKey:@"city"]; NSString *geocodeURL = [NSString stringWithFormat:@"http://maps.googleapis.com/maps/api/geocode/json?address=%@,+%@,&sensor=true", address, city]; geocodeURL = [geocodeURL stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:geocodeURL] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10]; NSLog(@"%@", request); geoCodeConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:YES]; if (geoCodeConnection) { responseData = [NSMutableData data]; connectionIsActive = YES; NSLog(@"connection active"); } else { NSLog(@"connection failed"); connectionIsActive = NO; } } } - (void)connectionDidFinishLoading:(NSURLConnection *)connection { NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding]; NSError *jsonError = nil; SBJsonParser *json = [[SBJsonParser alloc] init]; NSDictionary *parsedJSON = [json objectWithString:responseString error:&jsonError]; NSString *lat= [[[[parsedJSON valueForKey:@"results"] valueForKey:@"geometry"] valueForKey:@"location"] valueForKey:@"lat"]; NSString *lng= [[[[parsedJSON valueForKey:@"results"] valueForKey:@"geometry"] valueForKey:@"location"] valueForKey:@"lng"]; NSLog(@"lat = %@ long= %@", lat, lng); connectionIsActive = NO; [geoCodeLatArray addObject:lat]; [geoCodeLngArray addObject:lng]; NSLog(@"geoCodeArrayLat: %@", geoCodeLatArray); } 

Сейчас код возвращает только последний адрес «lat» и «long». Как я могу отправить многократные запросы и возвращать несколько ответов с помощью JSON?

Попробуйте это я использую это,

 for(int i=0;i< businessArray.count;i++) { NSString *address = [addressArray objectAtIndex:i]; NSString *city = [locationDict valueForKey:@"city"]; NSString *address = [NSString stringWithFormat:@"%@,%@", address, city]; CLLocationCoordinate2D location = [self geoCodeUsingAddress:address]; // then here store the location.latitude in lat array and location.longitude in long array. } - (CLLocationCoordinate2D) geoCodeUsingAddress:(NSString *)address { NSString *esc_addr = [address stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; NSString *req = [NSString stringWithFormat:@"http://maps.google.com/maps/api/geocode/json?sensor=false&address=%@", esc_addr]; NSDictionary *googleResponse = [[NSString stringWithContentsOfURL: [NSURL URLWithString: req] encoding: NSUTF8StringEncoding error: NULL] JSONValue]; NSDictionary *resultsDict = [googleResponse valueForKey: @"results"]; NSDictionary *geometryDict = [resultsDict valueForKey: @"geometry"]; NSDictionary *locationDict = [geometryDict valueForKey: @"location"]; NSArray *latArray = [locationDict valueForKey: @"lat"]; NSString *latString = [latArray lastObject]; NSArray *lngArray = [locationDict valueForKey: @"lng"]; NSString *lngString = [lngArray lastObject]; CLLocationCoordinate2D location; location.latitude = [latString doubleValue]; location.longitude = [lngString doubleValue]; return location; } 

Обновите функцию выше:

 - (CLLocationCoordinate2D) geoCodeUsingAddress:(NSString *)address { double latitude = 0, longitude = 0; NSString *esc_addr = [address stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; NSString *req = [NSString stringWithFormat:@"http://maps.google.com/maps/api/geocode/json?sensor=false&address=%@", esc_addr]; NSString *result = [NSString stringWithContentsOfURL:[NSURL URLWithString:req] encoding:NSUTF8StringEncoding error:NULL]; if (result) { NSScanner *scanner = [NSScanner scannerWithString:result]; if ([scanner scanUpToString:@"\"lat\" :" intoString:nil] && [scanner scanString:@"\"lat\" :" intoString:nil]) { [scanner scanDouble:&latitude]; if ([scanner scanUpToString:@"\"lng\" :" intoString:nil] && [scanner scanString:@"\"lng\" :" intoString:nil]) { [scanner scanDouble:&longitude]; } } } CLLocationCoordinate2D location; location.latitude = latitude; location.longitude = longitude; return location; } 

Это сработало для меня.

Вы можете обратиться к проблеме, используя асинхронный метод, который выполняет запрос, и имеет блок завершения, который будет вызываться, когда результат будет доступен. Этот блок завершения предоставляет результат параметра, который является результатом запроса соединения.

Этот метод может быть объявлен следующим образом:

 typedef void (^completion_block_t) (id result); - (void) fetchGeoCoordinateForAddress:(NSString*)address completionHandler:(completion_block_t)completionHandler; 

Скажем, если запрос завершится успешно, результат параметра в блоке представляет собой JSON-представление данных ответа. В противном случае результатом будет объект NSError, указывающий на ошибку. Но точные детали зависят от того, как вы реализуете метод fetchGeoCoordinateForAddress:completionHandler:

Теперь вы можете настроить цикл следующим образом:

 for (NSString* address in addresses) { [self fetchGeoCoordinateForAddress:address completionHandler:^(id result) { if (![result isKindOfError:[NSError class]]) // check if result is an error { // Note: result is not nil and is a NSDictionary representation of JSON. // Retrieve the "location" from the response: NSDictionary* location = result[@"results"][@"geometry"][@"location"]; // Multiple request can occur at the same time! Thus, we need to // synchronize access to the result array "myLocations" through // accessing it *exclusively and everywhere* on the main thread: dispatch_async(dispatch_get_main_queue(), ^{ [self.myLocations addObject:location]; }); } else { // got error DebugLog(@"ERROR: %@", result); } } } 

Примечание: ваш фактический код может немного отличаться в зависимости от фактического JSON и других деталей.

Что касается реализации метода fetchGeoCoordinateForAddress:completionHandler: вас есть несколько вариантов:

  1. Используйте стороннюю библиотеку и реализуйте простую удобную оболочку fetchGeoCoordinateForAddress:completionHandler:

  2. Создайте свой собственный класс «MyHTTPConnectionOperation», который инкапсулирует NSURLConnection и данные ответа и пару других полезных сведений о состоянии в выделенный класс. Этот класс выполняет запрос асинхронно с помощью метода start и имеет обработчик завершения. В принципе, все сторонние сетевые библиотеки будут использовать этот подход. Затем выполните обертку.

  3. Используйте асинхронный удобный метод NSURLConnection, если он достаточен и работает в вашем контексте. Это самый быстрый способ реализовать, но наименее гибкий подход и может не работать во всех случаях и может также работать только субоптимально.

Редактировать:

Несколько советов:

  • Если возможно, используйте NSJSONSerialization для анализа JSON и создания представления Foundation. Другие сторонние библиотеки предлагают только небольшое преимущество, если у вас есть особые требования, например, вам нужно «разделить партию с объектами NSData» – это полезно, когда вы хотите одновременно загружать и анализировать. Или вам нужно создать другие представления, кроме Foundation, – скажем, контейнер C ++, или вы хотите напрямую создать модель с синтаксисом стиля SAX. Или вам нужна более высокая производительность и более низкая память, поскольку вы получаете сверхбольшие строки, которые вы хотите сохранить на диск. NSJSONSerialization стала довольно быстрой, поэтому «производительность» сама по себе не должна быть аргументом сегодня.

  • Тайм-аут запроса должен быть не таким низким, как 10 секунд. В сотовой связи это слишком мало. Оставьте его по умолчанию.

  • Если вы планируете реализовать свой собственный класс «HTTPConnectionOperation», я поставил здесь очень ограниченный пример, который может дать вам начало перехода.

Я думаю, вы должны начать с AFNetworking

AFNetworking1
AFNetworking2

потому что AFNetworking дает большую мощность и гибкость в плане запросов на планирование и очередность, а также приостанавливает и отменяет запросы.

  • Swift NSURLSession действительно действительно очень медленный
  • NSURLConnection работает, но AFNetworking не работает (по определенному URL)
  • Несколько объектов Json и 3 строки в веб-службе JSON POST
  • Метод делегата NSURLConnection, запрашивающий аутентификацию, не уволен?
  • Почему тайм-аут NSURLConnection при отправке многих запросов?
  • Как предотвратить изменение порядка в NSDictionary в ios
  • Является ли NSURLConnection безопасным для sendSendRequestForAuthenticationChallenge?
  • почтовый метод в nsurlconnection в ios
  • Какое лучшее сетевое решение для сложного многопоточного приложения?
  • Parse.com NSURLErrorDomain Код = -1003 в сотовом не в wifi
  • NSURLConnection ПОЛУЧИТЬ ЗАПРОС
  • Давайте будем гением компьютера.