2013-02-15 2 views
3

Я ищу хороший учебник по использованию асинхронного запроса NSURLConnection. Я смотрел вокруг в stackoverflow и Google, но не смог найти его. Это может быть дубликат таких вопросов, как здесь. Но, пожалуйста, направьте меня в правильный учебник, раньше я использовал ASIHTTPRequest, но раньше я не использовал библиотеку, предоставленную Apple.Асинхронный учебный план NSURLConnection

+0

Есть ли конкретные детали, которые вы не понимаете? В ядре его всего несколько методов ... – jrturton

+0

Да, я пытаюсь понять этот метод sendAsynchronousRequest: queue: completionHandler: So Как мне сообщить, что запрос обработан. Что именно делает это завершениеHandler? Это правильный метод для обработки асинхронных запросов? Или существуют какие-либо другие методы. – user2070420

+0

Да, так или методы делегата, это хорошо. Вы знакомы с блоками? – jrturton

ответ

6

Я бы предоставил вам один написанный мной, однако я бы настоятельно рекомендовал использовать AFNetworking, это обертка над системой NSURLConnection/NSURLRequest, которая имеет намного более чистый поток, вы также можете использовать базовые NSURLRequests/Connections вместе с этим регулярные NSOperationQueues. В библиотеке также используются какао-стручки, и, честно говоря, вы действительно не можете стать намного чище, чем это.

NSOperationQueue *mainQueue = [[NSOperationQueue alloc] init]; 
[mainQueue setMaxConcurrentOperationCount:5]; 

NSURL *url = [NSURL URLWithString:@"http://192.168.0.63:7070/api/Misc/GetFuelTypes"]; 

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url]; 

[request setHTTPMethod:@"GET"]; 
[request setAllHTTPHeaderFields:@{@"Accepts-Encoding": @"gzip", @"Accept": @"application/json"}]; 

[NSURLConnection sendAsynchronousRequest:request queue:mainQueue completionHandler:^(NSURLResponse *response, NSData *responseData, NSError *error) { 
    NSHTTPURLResponse *urlResponse = (NSHTTPURLResponse *)response; 
    if (!error) { 
     NSLog(@"Status Code: %li %@", (long)urlResponse.statusCode, [NSHTTPURLResponse localizedStringForStatusCode:urlResponse.statusCode]); 
     NSLog(@"Response Body: %@", [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding]); 
    } 
    else { 
     NSLog(@"An error occured, Status Code: %i", urlResponse.statusCode); 
     NSLog(@"Description: %@", [error localizedDescription]); 
     NSLog(@"Response Body: %@", [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding]); 
    } 
}]; 

Объект mainQueue используется для запросов на маршрутизацию и управления количеством отправленных одновременно. Это можно использовать разными способами, я обычно использую их для категориального запроса (Аутентификация, Главная, Очередь загрузки)

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

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

Довольно простое объяснение, делегаты вам неприятности, если вы не имеете ни малейшего представления о том, как управлять несколькими запросов от одного объекта (вероятно, почему я предпочитаю блоки) :-)

Как всегда делегаты или блоки, которые вы хотите, чтобы вызвать ваш пользовательский интерфейс обновится после получения ответа, но не будет сдерживаться в ожидании завершения запроса, если вы загружаете данные в таблицу, вы будете называть запрос на загрузку и предоставлять некоторую форму прогресса, сообщая им, что запрос после получения данных вы удаляете hud и перезагружаете данные таблицы. HUDs ДОЛЖНЫ быть вызваны в основной поток, поэтому вам определенно нужно будет это обработать, я обычно просто создаю расширения и использую performSelectorOnMainThread, однако лучшим способом может быть обертывание вашей функции в dispatch_async и вызов вас - это показать/скрывать код вне что.

+0

Спасибо Holyprin, я знаю о AFNetworking и ASIHTTPRequest. Однако мне не разрешено использовать сторонние библиотеки, вот почему я пытаюсь начать с нуля. Так что было бы здорово, если бы вы предоставили мне свой учебник. – user2070420

+0

Угадайте, что имеет смысл, я напишу здесь несколько раз. – Holyprin

+0

Как сообщить своему пользовательскому интерфейсу, что задача выполнена, скажу, что я загружаю некоторые изображения, чтобы обновить себя. – user2070420

Смежные вопросы