0

Я создал массив NSURLConnections, поскольку я выполняю цикл for и создаю несколько NSURLConnections.Обработка ответа с NSURLConnection

Вот мой код

for(int i = 0; i <count; i++) 
{ 

NSData *jsonData = [NSJSONSerialization dataWithJSONObject:finalJson options:NSJSONWritingPrettyPrinted error:&error]; 
      if (!jsonData) { 
       NSLog(@"Error creating JSON object: %@", [error localizedDescription]); 
      } 

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"httpLink"]]; 


      [request setValue:@"application/json;charset=utf-8" forHTTPHeaderField:@"Content-Type"]; 
      [request setValue:APIKEY forHTTPHeaderField:@"X_API_KEY"]; 

      [request setHTTPMethod:@"POST"]; 
      [request setHTTPBody:jsonData]; 

      m_dataPush = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:NO]; 

      [m_dataPushArray addObject:m_dataPush]; 

      [m_dataPush start]; 


} 

Теперь, как это асинхронная задача, функции делегата будет называться, как показано ниже, я знаю, как обращаться с одного запроса, как показано ниже

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response 
{ 

    if(connection == m_dataPush || connection == m_dataPull) 
    { 
     NSHTTPURLResponse* httpResponse = (NSHTTPURLResponse*)response; 
     m_responseCode = [httpResponse statusCode];//Get status code for response 

     m_ResponseData = [[NSMutableData alloc] init]; 
    } 
} 

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { 
    // Append the new data to the instance variable you declared 


    if(connection == m_dataPush || connection == m_dataPull) 
    { 
     [m_ResponseData appendData:data]; 
    } 
} 


- (void)connectionDidFinishLoading:(NSURLConnection *)connection { 
    // The request is complete and data has been received 
    // You can parse the stuff in your instance variable now 


    if(connection == m_dataPush || connection == m_dataPull) 
    { 
     NSDictionary *response = [NSJSONSerialization JSONObjectWithData: m_ResponseData options: 0 error: &e]; //I am using sbjson to parse 

    } 
} 

Но я Не знаю, как я должен обрабатывать массив NSURLConnections в этом делетете

ответ

3

Это как один, за исключением того, что делегат должен сохранять состояние для всех из них. В минимальном коде делегата это означает сбор только данных ответа. Чтобы отслеживать, что именно, вам нужно что-то уникальное в них (чаще всего их запросы, которые уникальны как прокси для URL-адресов). Поскольку ваши запросы трудно отличить, безопасный ключ является указателем (в виде строки) в связи ...

Объявить словарь подключения:

@property(strong, nonatomic) NSMutableDictionary *dictionary; 

Создать соединение и сохранить его в словаре:

- (NSURLConnection *)connectionForRequest:(NSURLRequest *)request { 
    NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 
    NSString *key = [NSString stringWithFormat:@"%p", connection]; 

    // create response data for the connection and save it in the dictionary 
    self.dictionary[key] = [NSMutableData data]; 
    return connection; 
} 

Посмотрите его, когда вам это нужно и вернуть его изменчивую данные:

- (NSMutableData *)dataForConnection:(NSURLConnection *)connection { 

    NSString *key = [NSString stringWithFormat:@"%p", connection]; 
    return self.dictionary[key]; 
} 

Удалите его, когда вы закончите с этим:

- (void)removeConnection:(NSURLConnection *)connection { 

    NSString *key = [NSString stringWithFormat:@"%p", connection]; 
    return [self.dictionary removeObjectForKey:key]; 
} 

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

for(int i = 0; i <count; i++) { 

NSData *jsonData = [NSJSONSerialization dataWithJSONObject:finalJson options:NSJSONWritingPrettyPrinted error:&error]; 
    if (!jsonData) { 
     NSLog(@"Error creating JSON object: %@", [error localizedDescription]); 
    } 

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"httpLink"]]; 

    // setup the request as you do in your code 
    NSURLConnection *connection = [self connectionForRequest:request]; 
    [connection start]; 
} 

И делегат методы выглядеть следующим образом:

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { 

    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response; 
    if ([httpResponse statusCode] >= 400) { 
     NSLog(@"error"); 
    } 
} 

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { 
    // Append the new data to the instance variable you declared 

    NSMutableData *responseData = [self dataForConnection:connection]; 
    [responseData appendData:data]; 
} 


- (void)connectionDidFinishLoading:(NSURLConnection *)connection { 

    NSError *e; 
    NSMutableData *responseData = [self dataForConnection:connection]; 
    NSDictionary *result = [NSJSONSerialization JSONObjectWithData:responseData options: 0 error: &e]; 

    [self removeConnection:connection]; 

    // do whatever you do with result 
} 

Это нормально как шаблон общего назначения для создания соединений и быть делегатом. Вы можете обобщить создание таким способом:

+0

Здравствуйте @danh, я не могу пропустить последний, bcoz, я требую его соединений, которые dont come underthis – Ranjit

+0

@ Ranjit - Хорошо. Может быть проще просто сделать все соединения таким образом.Нет никакого вреда в том, что словарь содержит только одно соединение. – danh

+0

Так что теперь мне не нужен массив соединений, я должен использовать только словарь. Таким образом, создание соединения и вызов [начало соединения] в вышеуказанном коде остаются такими же? Итак, перед тем, как позвонить [начало соединения], я должен добавить его в словарь правильно? – Ranjit

0

Существует несколько подходов, которые вы можете использовать: 1) Подкласс NSURLConnection, добавив свойство, которое будет идентификатором (аналогично UIView, имеет свойство тега), поэтому в цикле вы устанавливаете тег с некоторым int. 2) С помощью кнопок + (аннулируются) sendAsynchronousRequest: (NSURLRequest *) очереди запросов: (NSOperationQueue ) очереди completionHandler: (аннулируются (^) (NSURLResponse, NSData *, NSError *)) обработчик

В случае 2, внутри блока вы можете обрабатывать каждое соединение отдельно (если вам нужно обрабатывать каждый по-другому, это утверждение недействительно. 3) По-моему, это лучший способ -> Создать NSMutableArray и добавить ваше соединение к массиву. В обратных вызовов вы можете спросить

if(connection isEqual:myConnections[0]){ 
    // Handle it 
} 

if(connection isEqual:myConnections[1]){ 
    // Handle it and so on 
} 

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

+0

Первый ответ имеет аналогичный подход к моему третьему варианту, но лучше –

+0

что делать, если 100 соединений? – Ranjit

+0

О! Я помню, что в некоторых версиях sdk у меня было ограничение до 8 подключений в настоящее время, оно не было документировано, но я видел это поведение, вы тестировали более 8 подключений? –