Работа с сетью
Разработка приложений для iOS
Лекция 7
Глеб Тарасов
gleb34@gmail.com
Вспомним прошлое
занятие
Как задается в Storyboard, какой
контроллер будет показан при
старте приложения?
Как задается в Storyboard, какой
контроллер будет показан при
старте приложения?
стрелочка слева, указывающая на контроллер;
либо галка «is initial controller»
Как в коде контроллера получить
ссылку на UILabel из storyboard
Как в коде контроллера получить
ссылку на UILabel из storyboard
правой кнопкой от label в storyboard
перетаскиваем в место,
где пишут свойства, и создаем IBOutlet
Как по нажатию кнопки из
storyboard выполнить метод в
коде контроллера?
Как по нажатию кнопки из
storyboard выполнить метод в
коде контроллера?
правой кнопкой от кнопки перетаскиваем в код и
создаем IBAction
Как сделать, чтобы по нажатию на
кнопку в navigation пушился другой
контроллер?
Как сделать, чтобы по нажатию на
кнопку в navigation пушился другой
контроллер?
Добавить в Storyboard этот контроллер, а потом
правой кнопкой провести от кнопки к контроллеру и
выбрать «push»
Блоки
(лямбда выражения)
BasicBlock action = ^{
NSLog(@"Hello, world!");
};
action();
Блок кода без параметров
StringBlock action = ^(NSString *str) {
NSLog(@"Hello, %@", str);
};
action(@"world!");
Блок кода с параметром - строка
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];
Блок кода с двумя параметрами
- (void)loadUsersWithAction:(LoadBlock)action
{
NSArray *users = ...;
if (users)
{
action(YES, users);
}
else
{
action(NO, nil);
}
}
Блок как параметр метода
typedef void(^BasicBlock)();
typedef void(^StringBlock)(NSString *str);
typedef void(^LoadBlock)(BOOL success, NSArray *arr);
Объявление типов блоков
http://fuckingblocksyntax.com
Потоки
// Main thread
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// Background thread
dispatch_async(dispatch_get_main_queue(), ^{
// Main thread
});
});
Как запустить код в фоне, а
потом обновить интерфейс
- (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;
}
});
});
}
Загрузка данных
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);
Загрузить строку по ссылке
Загрузить бинарные данные по
ссылке
JSON
{!
"firstName": "Иван",!
"lastName": "Иванов",!
"address": {!
"streetAddress": "Московское ш., 101, кв.101",!
"city": "Ленинград",!
"postalCode": 101101!
},!
"phoneNumbers": [!
"812 123-1234",!
"916 123-4567"!
]!
}
http://ru.wikipedia.org/wiki/JSON
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
NSString *json = ...;
NSData *data = [json dataUsingEncoding:NSUTF8StringEncoding];
NSArray *arr = [NSJSONSerialization JSONObjectWithData:data
options:0
error:nil];
NSLog(@"%@", arr);
Преобразовать json в массив
JSON в dropbox	

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

• поменять в ссылке www на dl
CocoaPods
(подключение сторонних библиотек)
http://cocoapods.org
В консоли (Программы > Утилиты > Терминал):	
.
$ sudo gem install cocoapods	
.
.
После этого, чтобы проверить:	
.
$ pod search AFNetworking
Установка
Если выдаст ошибку, то сначала «sudo gem install rake» и нажать «Y», когда спросит, 6
а потом «sudo gem install cocoapods»
Как использовать?
• создаем файл с именем Podfile в папке
проекта	

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

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

• с этого момента запускаем не .xcodeproj
файл, а .xcworkspace
Общение с сервером
HTTP - протокол передачи данных	

GET-запрос: вызов урла.
http://site.com/folder/file.php?param1=v1&param2=v2
POST-запрос: вызов урла с параметрами.
http://site.com/folder/file.php.
.
param1 = v1.
param2 = v2
Вычитка списка магазинов (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
Вычитка списка магазинов (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.
}.
].
}
Авторизация (POST).
http://site.com/api/login.php
{.
"result" : "error",.
"error" : "Неверный пароль".
}
{.
"result" : "success",.
"token" : "kjhkdsfhsdofsdfsdf".
}
Отправка комментария к магазину (POST).
http://site.com/api/send_comment.php
{.
"result" : "success".
}
AFNetworking
(работа с сетью)
@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>
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-запрос
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-запрос
Домашнее задание
• добавить работу с сервером в ваше
приложение (либо загрузка файлов, либо
загрузка картинок, либо загрузка данных
через json).	

• можно просто через загрузку NSString и
NSData, можно через AFNetworking
Всё!
Глеб Тарасов	

gleb34@gmail.com	

twitter.com/pilot34

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

  • 1.
    Работа с сетью Разработкаприложений для iOS Лекция 7 Глеб Тарасов gleb34@gmail.com
  • 2.
  • 3.
    Как задается вStoryboard, какой контроллер будет показан при старте приложения?
  • 4.
    Как задается вStoryboard, какой контроллер будет показан при старте приложения? стрелочка слева, указывающая на контроллер; либо галка «is initial controller»
  • 5.
    Как в кодеконтроллера получить ссылку на UILabel из storyboard
  • 6.
    Как в кодеконтроллера получить ссылку на UILabel из storyboard правой кнопкой от label в storyboard перетаскиваем в место, где пишут свойства, и создаем IBOutlet
  • 7.
    Как по нажатиюкнопки из storyboard выполнить метод в коде контроллера?
  • 8.
    Как по нажатиюкнопки из storyboard выполнить метод в коде контроллера? правой кнопкой от кнопки перетаскиваем в код и создаем IBAction
  • 9.
    Как сделать, чтобыпо нажатию на кнопку в navigation пушился другой контроллер?
  • 10.
    Как сделать, чтобыпо нажатию на кнопку в navigation пушился другой контроллер? Добавить в Storyboard этот контроллер, а потом правой кнопкой провести от кнопки к контроллеру и выбрать «push»
  • 11.
  • 12.
    BasicBlock action =^{ NSLog(@"Hello, world!"); }; action(); Блок кода без параметров
  • 13.
    StringBlock action =^(NSString *str) { NSLog(@"Hello, %@", str); }; action(@"world!"); Блок кода с параметром - строка
  • 14.
    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]; Блок кода с двумя параметрами
  • 15.
    - (void)loadUsersWithAction:(LoadBlock)action { NSArray *users= ...; if (users) { action(YES, users); } else { action(NO, nil); } } Блок как параметр метода
  • 16.
    typedef void(^BasicBlock)(); typedef void(^StringBlock)(NSString*str); typedef void(^LoadBlock)(BOOL success, NSArray *arr); Объявление типов блоков
  • 17.
  • 18.
  • 20.
    // Main thread dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{ // Background thread dispatch_async(dispatch_get_main_queue(), ^{ // Main thread }); }); Как запустить код в фоне, а потом обновить интерфейс
  • 21.
    - (void)viewDidLoad { // Mainthread [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; } }); }); }
  • 22.
  • 23.
    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); Загрузить строку по ссылке Загрузить бинарные данные по ссылке
  • 24.
  • 25.
    {! "firstName": "Иван",! "lastName": "Иванов",! "address":{! "streetAddress": "Московское ш., 101, кв.101",! "city": "Ленинград",! "postalCode": 101101! },! "phoneNumbers": [! "812 123-1234",! "916 123-4567"! ]! } http://ru.wikipedia.org/wiki/JSON
  • 26.
    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
  • 27.
    NSString *json =...; NSData *data = [json dataUsingEncoding:NSUTF8StringEncoding]; NSArray *arr = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil]; NSLog(@"%@", arr); Преобразовать json в массив
  • 28.
    JSON в dropbox длятренировки • поделиться ссылкой в dropbox • поменять в ссылке www на dl
  • 29.
  • 30.
    http://cocoapods.org В консоли (Программы> Утилиты > Терминал): . $ sudo gem install cocoapods . . После этого, чтобы проверить: . $ pod search AFNetworking Установка Если выдаст ошибку, то сначала «sudo gem install rake» и нажать «Y», когда спросит, 6 а потом «sudo gem install cocoapods»
  • 31.
    Как использовать? • создаемфайл с именем Podfile в папке проекта • пишем там pod ‘Имя библиотеки’ • после этого в консоли в этой папке вызываем «pod install» • с этого момента запускаем не .xcodeproj файл, а .xcworkspace
  • 32.
  • 33.
    HTTP - протоколпередачи данных GET-запрос: вызов урла. http://site.com/folder/file.php?param1=v1&param2=v2 POST-запрос: вызов урла с параметрами. http://site.com/folder/file.php. . param1 = v1. param2 = v2
  • 34.
    Вычитка списка магазинов(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
  • 35.
    Вычитка списка магазинов(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. }. ]. }
  • 36.
    Авторизация (POST). http://site.com/api/login.php {. "result" :"error",. "error" : "Неверный пароль". } {. "result" : "success",. "token" : "kjhkdsfhsdofsdfsdf". }
  • 37.
    Отправка комментария кмагазину (POST). http://site.com/api/send_comment.php {. "result" : "success". }
  • 38.
  • 39.
    @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>
  • 40.
    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-запрос
  • 41.
    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-запрос
  • 42.
    Домашнее задание • добавитьработу с сервером в ваше приложение (либо загрузка файлов, либо загрузка картинок, либо загрузка данных через json). • можно просто через загрузку NSString и NSData, можно через AFNetworking
  • 43.