18
iOS Internship 2014 Работа с сетью

работа с сетью

  • Upload
    noveo

  • View
    186

  • Download
    1

Embed Size (px)

DESCRIPTION

Noveo iOS school. Lecture 8.

Citation preview

Page 1: работа с сетью

iOS Internship 2014Работа с сетью

Page 2: работа с сетью

Загрузка в NSDataNSURLRequest, NSURLConnection

Работа с JSONAFNetworking

лекция 8

Работа с сетью

Page 3: работа с сетью

Работа с сетью

● Ошибки при работе с сетью — штатная ситуация● Сеть может быть медленная● Сети может вообще не быть● Загрузка данных может стоить пользователю денег :)

Работа с сетью в iOS

Page 4: работа с сетью

Работа с сетью

● Ошибки при работе с сетью — штатная ситуация● Сеть может быть медленная● Сети может вообще не быть● Загрузка данных может стоить пользователю денег :)

Как жить:

● Проверяем доступность сервера● Обрабатываем возможные ошибки сети● Обрабатываем возможные ошибки в формате данных● Ограничиваем количество одновременных запросов● Один большой запрос быстрее, чем много маленьких● Никогда не работаем с сетью в главном потоке● Уважаем пользователя: кэшируем что можно, экономим трафик, показываем спиннер

Работа с сетью в iOS

Page 5: работа с сетью

Работа с сетью

● Самый простой способ загрузить данные из сети (в одну строку)

● Сам по себе способ синхронный (блокирует текущий поток)

● Практически не применим в реальной работе:

○ Слабая обработка ошибок

○ Только HTTP GET

○ Нет управления заголовками

○ Нет докачки

○ …

Загрузка в NSData

Page 6: работа с сетью

Работа с сетью

NSURL *url = [NSURL URLWithString:@"http://server.org/some/path"];

NSData *data = [NSData dataWithContentsOfURL:url];

// Данные загружены, можно использовать

//...

Загрузка в NSData

Page 7: работа с сетью

Работа с сетью

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

Page 8: работа с сетью

Работа с сетью

● Есть обработка ошибок и кодов ответа

● Можно делать запросы с любым методом (GET/POST/PUT/DELETE/...)

● Поддержка редиректов, авторизации, управление кешированием и т.д.

● Можно управлять заголовками запроса

● Можно организовать докачку

● Применимо на практике, но…:

○ Много кода

○ Желательно выделить всю низкоуровневую работу в переиспользуемый компонент

NSURLRequest, NSURLConnection

Page 9: работа с сетью

Работа с сетью

Необходимый минимум для работы с 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

Page 10: работа с сетью

Работа с сетью

Новый (появился в iOS 7) продвинутый API для работы с сетью:

● Загрузка/отправка данных в background-режиме.

● Возможность остановить и продолжить загрузку.

● Возможность задать общие настройки для всех запросов сессии.

● Автоматическое скачивание в файл.

● Гибкое управление количеством одновременных соединений и возможность отложить загрузку до подходящего момента (когда появится wi-fi).

● Возможность определить хранилища для cookie и кэша.

NSURLSession

Page 11: работа с сетью

Работа с сетью

JSON (JavaScript Object Notation) — простой формат обмена данными, удобный для чтения и написания как человеком, так и компьютером.

● Используется большей частью современных сетевых API● Лаконичнее чем XML● Однозначнее чем XML (легко транслируется в термины стандартных коллекций)● Поддерживается стандартной библиотекой iOS SDK

JSON

Page 12: работа с сетью

Работа с сетью

Имеет всего три базовых понятия:

● Словарь (коллекция пар ключ/значение, ассоциативный массив, объект)● Массив (упорядоченный список значений, вектор)● Значение одного из типов:

○ строка (в кавычках, экранирующий символ — обратный слэш)○ целое число○ число с плавающей точкой○ булево значение (true/false)○ null○ словарь (пары "ключ":значение через запятую в фигурных скобках)○ массив (значения через запятую в квадратных скобках)

Последние два типа поддерживают вложенность.

JSON терминология

Page 13: работа с сетью

Работа с сетью

{ "firstName": "Иван", "lastName": "Иванов", "age": 42, "address": { "streetAddress": "Московское ш., 101, кв.101", "city": "Ленинград", "postalCode": 101101 }, "phoneNumbers": [ "812 123-1234", "916 123-4567" ]}

JSON пример

Page 14: работа с сетью

Работа с сетью

NSError *error = nil;

NSDictionary *dict =[NSJSONSerialization JSONObjectWithData:data options:0 error:&error];

if (error != nil) {// Обработка ошибки

//...}else {

// Работа с полученной структурой данных//...

}

NSJSONSerialization

Page 15: работа с сетью

Работа с сетью

Популярная библиотека для работы с сетью под iOS и MacOS.

● Высокоуровневое API (абстракции для запросов, очередей, типов данных, кэша и т.д.)

● Модульная архитектура (сессии, reachability, JSON, security, загрузка картинок и т.д.)

● Относительно немного кода для решения простых задач

● Поддержка решения сложных задач (AFIncrementalStore и т.д.)

Page 16: работа с сетью

Работа с сетью

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) {

// Обработка ошибки}];

}

Page 17: работа с сетью

Работа с сетью

#import <AFNetworking/AFNetworkReachabilityManager.h> //...

AFNetworkReachabilityManager *rm = [AFNetworkReachabilityManager sharedManager];[rm setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {

if (status == AFNetworkReachabilityStatusNotReachable) {// Пропал доступ к сети//...

}else {

// Появился доступ к сети//...

}}];[rm startMonitoring];

if ([rm isReachable]) {// Есть доступ к сети//...

}

AFNetworking проверка наличия соединения

Page 18: работа с сетью

Работа с сетью

#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 работа с операциями и очередями