43
Работа с сетью Разработка приложений для iOS Лекция 7 Глеб Тарасов [email protected]

Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетью

  • Upload
    -

  • View
    674

  • Download
    7

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетью

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

Разработка приложений для iOS

Лекция 7

Глеб Тарасов[email protected]

Page 2: Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетью

Вспомним прошлое занятие

Page 3: Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетью

Как задается в Storyboard, какой контроллер будет показан при

старте приложения?

Page 4: Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетью

Как задается в Storyboard, какой контроллер будет показан при

старте приложения?

стрелочка слева, указывающая на контроллер; либо галка «is initial controller»

Page 5: Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетью

Как в коде контроллера получить ссылку на UILabel из storyboard

Page 6: Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетью

Как в коде контроллера получить ссылку на UILabel из storyboard

правой кнопкой от label в storyboard перетаскиваем в место,

где пишут свойства, и создаем IBOutlet

Page 7: Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетью

Как по нажатию кнопки из storyboard выполнить метод в

коде контроллера?

Page 8: Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетью

Как по нажатию кнопки из storyboard выполнить метод в

коде контроллера?

правой кнопкой от кнопки перетаскиваем в код и создаем IBAction

Page 9: Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетью

Как сделать, чтобы по нажатию на кнопку в navigation пушился другой

контроллер?

Page 10: Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетью

Как сделать, чтобы по нажатию на кнопку в navigation пушился другой

контроллер?

Добавить в Storyboard этот контроллер, а потом правой кнопкой провести от кнопки к контроллеру и

выбрать «push»

Page 11: Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетью

Блоки(лямбда выражения)

Page 12: Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетью

BasicBlock action = ^{ NSLog(@"Hello, world!"); }; action();

Блок кода без параметров

Page 13: Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетью

StringBlock action = ^(NSString *str) { NSLog(@"Hello, %@", str); }; action(@"world!");

Блок кода с параметром - строка

Page 14: Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетью

LoadBlock action = ^(BOOL success, NSArray *arr) { if (success) { self.array = arr; [self.tableView reloadData]; } else { self.errorLabel.hidden = NO; } }; Server *s = [[Server alloc] init]; [s loadUsersWithAction:action];

Блок кода с двумя параметрами

Page 15: Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетью

- (void)loadUsersWithAction:(LoadBlock)action { NSArray *users = ...; if (users) { action(YES, users); } else { action(NO, nil); } }

Блок как параметр метода

Page 16: Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетью

typedef void(^BasicBlock)(); typedef void(^StringBlock)(NSString *str); typedef void(^LoadBlock)(BOOL success, NSArray *arr);

Объявление типов блоков

Page 17: Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетью

http://fuckingblocksyntax.com

Page 18: Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетью

Потоки

Page 19: Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетью
Page 20: Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетью

// Main thread dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ // Background thread dispatch_async(dispatch_get_main_queue(), ^{ // Main thread }); });

Как запустить код в фоне, а потом обновить интерфейс

Page 21: Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетью

- (void)viewDidLoad { // Main thread [self.activityIndicator startAnimating]; self.server = [[Server alloc] init]; dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ . // Background thread self.users = [self.server loadUsers]; dispatch_async(dispatch_get_main_queue(), ^{ . // Main thread [self.activityIndicator stopAnimating]; if (self.users.count > 0) { [self.tableView reloadData]; self.tableView.hidden = NO; } else { self.emptyLabel.hidden = NO; } }); }); }

Page 22: Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетью

Загрузка данных

Page 23: Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетью

NSURL *url = [NSURL URLWithString:@"http://intuit.ru"]; NSString *str = [[NSString alloc] initWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil]; .NSLog(@"%@", str);

NSURL *url = [NSURL URLWithString:@"http://www.intuit.ru/logo.png"]; NSData *data = [[NSData alloc] initWithContentsOfURL:url]; .NSLog(@"%@", data);

Загрузить строку по ссылке

Загрузить бинарные данные по ссылке

Page 24: Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетью

JSON

Page 25: Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетью

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

http://ru.wikipedia.org/wiki/JSON

Page 26: Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетью

NSArray *arr = @[ @"str1", @"str2", @3 ]; NSData *data = [NSJSONSerialization dataWithJSONObject:arr options:0 error:nil]; .NSString *json = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; .NSLog(@"%@", json);

Преобразовать массив в json

Page 27: Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетью

NSString *json = ...; NSData *data = [json dataUsingEncoding:NSUTF8StringEncoding]; NSArray *arr = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil]; NSLog(@"%@", arr);

Преобразовать json в массив

Page 28: Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетью

JSON в dropbox для тренировки

• поделиться ссылкой в dropbox

• поменять в ссылке www на dl

Page 29: Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетью

CocoaPods(подключение сторонних библиотек)

Page 30: Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетью

http://cocoapods.org

В консоли (Программы > Утилиты > Терминал):.$ sudo gem install cocoapods..После этого, чтобы проверить:.$ pod search AFNetworking

Установка

Если выдаст ошибку, то сначала «sudo gem install rake» и нажать «Y», когда спросит, 6а потом «sudo gem install cocoapods»

Page 31: Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетью

Как использовать?

• создаем файл с именем Podfile в папке проекта

• пишем там pod ‘Имя библиотеки’

• после этого в консоли в этой папке вызываем «pod install»

• с этого момента запускаем не .xcodeproj файл, а .xcworkspace

Page 32: Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетью

Общение с сервером

Page 33: Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетью

HTTP - протокол передачи данных

GET-запрос: вызов урла.http://site.com/folder/file.php?param1=v1&param2=v2

POST-запрос: вызов урла с параметрами.http://site.com/folder/file.php..

param1 = v1.param2 = v2

Page 34: Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетью

Вычитка списка магазинов (GET).http://site.com/api/shops.php..

Вычитка списка магазинов по категории (GET).http://site.com/api/shops.php?category=auto..

Авторизация (POST).http://site.com/api/login.php.login = user.password = 12345..

Отправка комментария к магазину (POST).http://site.com/api/send_comment.php.shop_id = 123.comment_text = отличный магазин.token = asdasdasdasd

Page 35: Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетью

Вычитка списка магазинов (GET).http://site.com/api/shops.php.

{. "shops": [. {. "title": "Пятерочка",. "location": "50.12321,30.12324",. "rating": 4.5,. "comments_count": 20. },. {. "title": "Седьмой континент",. "location": "51.21321,34.132",. "rating": 4.8,. "comments_count": 17. }. ].}

Page 36: Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетью

Авторизация (POST).http://site.com/api/login.php

{. "result" : "error",. "error" : "Неверный пароль".}

{. "result" : "success",. "token" : "kjhkdsfhsdofsdfsdf".}

Page 37: Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетью

Отправка комментария к магазину (POST).http://site.com/api/send_comment.php

{. "result" : "success".}

Page 38: Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетью

AFNetworking(работа с сетью)

Page 39: Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетью

@interface ViewController () .@property (strong, nonatomic) AFHTTPSessionManager *manager; .@end

- (void)viewDidLoad { [super viewDidLoad]; NSURL *baseUrl = [NSURL URLWithString:@"http:// api.worldweatheronline.com/free/v1/"]; self.manager = [[AFHTTPSessionManager alloc] initWithBaseURL:baseUrl]; self.manager.responseSerializer = [AFJSONResponseSerializer serializer]; }

#import <AFNetworking/AFNetworking.h>

Page 40: Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетью

NSDictionary *params = @{ @"q" : @"Moscow", @"format" : @"json", @"num_of_days" : @1, @"key" : @"hnhq9j8ta97x5d9hbap7sk5q" }; .[self.manager GET:@"weather.ashx" parameters:params success:^(NSURLSessionDataTask *task, id responseObject) { NSDictionary *result = responseObject; NSLog(@"%@", result); } failure:^(NSURLSessionDataTask *task, NSError *error) { }];

GET-запрос

Page 41: Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетью

NSDictionary *params = @{ @"q" : @"Moscow", @"format" : @"json", @"num_of_days" : @1, @"key" : @"hnhq9j8ta97x5d9hbap7sk5q" }; .[self.manager POST:@"weather.ashx" parameters:params success:^(NSURLSessionDataTask *task, id responseObject) { NSDictionary *result = responseObject; NSLog(@"%@", result); } failure:^(NSURLSessionDataTask *task, NSError *error) { }];

POST-запрос

Page 42: Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетью

Домашнее задание

• добавить работу с сервером в ваше приложение (либо загрузка файлов, либо загрузка картинок, либо загрузка данных через json).

• можно просто через загрузку NSString и NSData, можно через AFNetworking

Page 43: Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетью

Всё!

Глеб Тарасов [email protected] twitter.com/pilot34