работа с сетью
DESCRIPTION
Noveo iOS school. Lecture 8.TRANSCRIPT
iOS Internship 2014Работа с сетью
Загрузка в NSDataNSURLRequest, NSURLConnection
Работа с JSONAFNetworking
лекция 8
Работа с сетью
Работа с сетью
● Ошибки при работе с сетью — штатная ситуация● Сеть может быть медленная● Сети может вообще не быть● Загрузка данных может стоить пользователю денег :)
Работа с сетью в iOS
Работа с сетью
● Ошибки при работе с сетью — штатная ситуация● Сеть может быть медленная● Сети может вообще не быть● Загрузка данных может стоить пользователю денег :)
Как жить:
● Проверяем доступность сервера● Обрабатываем возможные ошибки сети● Обрабатываем возможные ошибки в формате данных● Ограничиваем количество одновременных запросов● Один большой запрос быстрее, чем много маленьких● Никогда не работаем с сетью в главном потоке● Уважаем пользователя: кэшируем что можно, экономим трафик, показываем спиннер
Работа с сетью в iOS
Работа с сетью
● Самый простой способ загрузить данные из сети (в одну строку)
● Сам по себе способ синхронный (блокирует текущий поток)
● Практически не применим в реальной работе:
○ Слабая обработка ошибок
○ Только HTTP GET
○ Нет управления заголовками
○ Нет докачки
○ …
Загрузка в NSData
Работа с сетью
NSURL *url = [NSURL URLWithString:@"http://server.org/some/path"];
NSData *data = [NSData dataWithContentsOfURL:url];
// Данные загружены, можно использовать
//...
Загрузка в NSData
Работа с сетью
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSURL *url = [NSURL URLWithString:@"http://server.org/some/path"];
NSData *data = [NSData dataWithContentsOfURL:url];
// Данные загружены, можно использовать
//...
});
//...
// Здесь данные ещё не загружены! (хотя кто знает... :)
//...
Загрузка в NSData
Работа с сетью
● Есть обработка ошибок и кодов ответа
● Можно делать запросы с любым методом (GET/POST/PUT/DELETE/...)
● Поддержка редиректов, авторизации, управление кешированием и т.д.
● Можно управлять заголовками запроса
● Можно организовать докачку
● Применимо на практике, но…:
○ Много кода
○ Желательно выделить всю низкоуровневую работу в переиспользуемый компонент
NSURLRequest, NSURLConnection
Работа с сетью
Необходимый минимум для работы с NSURLConnection:
● Создаём и конфигурируем NSURLRequest● Создаём и конфигурируем NSURLConnection для request-а● Задаём объект-делегат для connection-а● В делегате реализуем следующие методы:
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)responseПроверить код ответа. Подготовиться к получению данных (выделить/очистить буфер для данных).
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)dataСохранить полученные данные. Обновить прогресс-бар, если он есть.
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)errorОбработать ошибку.
- (void)connectionDidFinishLoading:(NSURLConnection *)connectionОбработать завершение запроса (данные уже получены/отправлены).
NSURLRequest, NSURLConnection
Работа с сетью
Новый (появился в iOS 7) продвинутый API для работы с сетью:
● Загрузка/отправка данных в background-режиме.
● Возможность остановить и продолжить загрузку.
● Возможность задать общие настройки для всех запросов сессии.
● Автоматическое скачивание в файл.
● Гибкое управление количеством одновременных соединений и возможность отложить загрузку до подходящего момента (когда появится wi-fi).
● Возможность определить хранилища для cookie и кэша.
NSURLSession
Работа с сетью
JSON (JavaScript Object Notation) — простой формат обмена данными, удобный для чтения и написания как человеком, так и компьютером.
● Используется большей частью современных сетевых API● Лаконичнее чем XML● Однозначнее чем XML (легко транслируется в термины стандартных коллекций)● Поддерживается стандартной библиотекой iOS SDK
JSON
Работа с сетью
Имеет всего три базовых понятия:
● Словарь (коллекция пар ключ/значение, ассоциативный массив, объект)● Массив (упорядоченный список значений, вектор)● Значение одного из типов:
○ строка (в кавычках, экранирующий символ — обратный слэш)○ целое число○ число с плавающей точкой○ булево значение (true/false)○ null○ словарь (пары "ключ":значение через запятую в фигурных скобках)○ массив (значения через запятую в квадратных скобках)
Последние два типа поддерживают вложенность.
JSON терминология
Работа с сетью
{ "firstName": "Иван", "lastName": "Иванов", "age": 42, "address": { "streetAddress": "Московское ш., 101, кв.101", "city": "Ленинград", "postalCode": 101101 }, "phoneNumbers": [ "812 123-1234", "916 123-4567" ]}
JSON пример
Работа с сетью
NSError *error = nil;
NSDictionary *dict =[NSJSONSerialization JSONObjectWithData:data options:0 error:&error];
if (error != nil) {// Обработка ошибки
//...}else {
// Работа с полученной структурой данных//...
}
NSJSONSerialization
Работа с сетью
Популярная библиотека для работы с сетью под iOS и MacOS.
● Высокоуровневое API (абстракции для запросов, очередей, типов данных, кэша и т.д.)
● Модульная архитектура (сессии, reachability, JSON, security, загрузка картинок и т.д.)
● Относительно немного кода для решения простых задач
● Поддержка решения сложных задач (AFIncrementalStore и т.д.)
Работа с сетью
AFNetworking запрос JSON
#import <AFNetworking.h>//...@property (strong, nonatomic) AFHTTPRequestOperationManager *requestManager;//... - (instancetype)initWithBaseURL:(NSURL *)baseAPIURL{
//...requestManager_ = [[AFHTTPRequestOperationManager alloc] initWithBaseURL:baseAPIURL];//...
} - (void)downloadObjectWithURL:(NSString *)objectURL{
[self.requestManager GET:objectURLparameters:nilsuccess:^(AFHTTPRequestOperation *operation, NSDictionary *someObject) {
// В объекте someObject — уже разобранный JSON-ответ}failure:^(AFHTTPRequestOperation *operation, NSError *error) {
// Обработка ошибки}];
}
Работа с сетью
#import <AFNetworking/AFNetworkReachabilityManager.h> //...
AFNetworkReachabilityManager *rm = [AFNetworkReachabilityManager sharedManager];[rm setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
if (status == AFNetworkReachabilityStatusNotReachable) {// Пропал доступ к сети//...
}else {
// Появился доступ к сети//...
}}];[rm startMonitoring];
if ([rm isReachable]) {// Есть доступ к сети//...
}
AFNetworking проверка наличия соединения
Работа с сетью
#import <AFNetworking.h> //...
AFHTTPRequestOperation *myOperation = [[AFHTTPRequestOperation alloc] initWithRequest:getAvatarRequest];
[myOperationsetCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id response) {
//...}failure:^(AFHTTPRequestOperation *operation, NSError *error) {
//...}];
NSOperationQueue *operationQueue = [[NSOperationQueue alloc] init];[operationQueue addOperation:myOperation];
AFNetworking работа с операциями и очередями