Какой делегат NSURLConnection использовать - PullRequest
2 голосов
/ 04 июня 2011

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

NSString *returnString = [[NSString alloc] initWithData:[NSURLConnection sendSynchronousRequest:urlrequest returningResponse:nil error:nil] encoding:NSUTF8StringEncoding];

А другой способ получить его - через connectionDidFinishLoading

    [..]
    NSURLConnection *theConnection = [[NSURLConnection alloc] initWithRequest:urlrequest delegate:self];  

    NSHTTPURLResponse *response;  
   [NSURLConnection sendSynchronousRequest: urlrequest returningResponse: &response error: nil];   

    if( theConnection )  
    {  
        webData = [[NSMutableData data] retain];  
    }  
    else  
    {  
        NSLog(@"theConnection is NULL");  
    }  

}  

-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{   
    [webData setLength: 0];  
}  
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data  
{  
    [webData appendData:data];  
}  
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{  
    NSLog(@"ERROR with theConenction");  
    [connection release];  
    [webData release];  
}  
-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{  
    NSLog(@"DONE. Received Bytes: %d", [webData length]);  
    NSString *theXML = [[NSString alloc] initWithBytes: [webData mutableBytes] length:  [webData length] encoding:NSUTF8StringEncoding];  
}

Есть лиразница между этими двумя?Метод делегата NSURLConnection не вызывается, когда я использую отдельный класс для разбора ответа.

Ответы [ 3 ]

4 голосов
/ 04 июня 2011

Вы используете sendSynchronousRequest: returningResponse: error: , который не вызывает методы делегатов, потому что ему не нужно: когда вы вызываете его, основной поток останавливается, пока запрос не будет завершен, и выполучить ответ.

Если вы хотите сделать асинхронный запрос, используйте connectionWithRequest: делегат: .Я рекомендую всегда делать асинхронные ответы, так как синхронный запрос блокирует основной поток, и ваш пользовательский интерфейс не может ответить в течение этого времени.Анимация будет прервана.Прокрутка становится рывком.Если вы хотите использовать синхронные запросы, вы должны сделать это в фоновом потоке.

1 голос
/ 04 июня 2011

Метод -sendSynchronousRequest: returningResponse: error: блокирует основной поток (конечно, всякий раз, когда он запускается в основном потоке, поскольку этот метод можно запустить из любого другого потока, но я считаю,это не рекомендуется).

Методы, использующие делегаты, являются асинхронными, методы запускаются, и результаты (в некоторый момент в будущем) будут возвращены в методах делегатов.Это дает пользователю более гладкую работу, так как основной поток не будет заблокирован.

Редактировать: лично Я почти никогда не использую метод -sendSynchronousRequest: returningResponse: error: по вышеупомянутым причинам.Большую часть времени я использую этот метод, когда мне нужно быстро что-то построить, например, для проверки концепции.Я думаю, что можно использовать метод для небольших загрузок, но если произойдет тайм-аут (потому что по какой-то причине сервер не работает), весь пользовательский интерфейс будет заблокирован на (я полагаю) 2 минуты, что будет очень раздражать для конечного пользователя.

0 голосов
/ 04 июня 2011

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

...