Школа-студия разработки для ios. Лекция 4. Работа с...

54
Работа с данными Разработка приложений для iOS Лекция 4 Глеб Тарасов

Upload: -

Post on 04-Dec-2014

7.273 views

Category:

Education


9 download

DESCRIPTION

 

TRANSCRIPT

Page 1: Школа-студия разработки для iOS. Лекция 4. Работа с данными

Работа с данными

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

Лекция 4

Глеб Тарасов

Page 2: Школа-студия разработки для iOS. Лекция 4. Работа с данными

Насчет ДЗ• для кнопки сделать базовый класс

• насчет иконок в tabBar

• стрелки в таблицеhttp://glyphish.com/

Page 3: Школа-студия разработки для iOS. Лекция 4. Работа с данными

Стрелки в ячейках

Page 4: Школа-студия разработки для iOS. Лекция 4. Работа с данными

Варианты хранения данных?

Page 5: Школа-студия разработки для iOS. Лекция 4. Работа с данными

Яндекс.Карты

Page 6: Школа-студия разработки для iOS. Лекция 4. Работа с данными

Аудиокнига

Page 7: Школа-студия разработки для iOS. Лекция 4. Работа с данными

Аудиокнига с возможностью покупки

Page 8: Школа-студия разработки для iOS. Лекция 4. Работа с данными

Новости

Page 9: Школа-студия разработки для iOS. Лекция 4. Работа с данными

Новости с возможностью оффлайн чтения

Page 10: Школа-студия разработки для iOS. Лекция 4. Работа с данными

Лекции и тесты

Page 11: Школа-студия разработки для iOS. Лекция 4. Работа с данными

10 000 магазиновсразу после установки программы

Page 12: Школа-студия разработки для iOS. Лекция 4. Работа с данными

• Файлы (загружаются из сети или поставляются вместе с приложением)

• Данные загружаются из сети в память и нигде не сохраняются

• Данные загружаются из сети, кешируются на какое-то время

• Данные загружаются из сети, сохраняются в базу данных

• База данных поставляется вместе с приложением

Page 13: Школа-студия разработки для iOS. Лекция 4. Работа с данными

Работа с потоками

Page 14: Школа-студия разработки для iOS. Лекция 4. Работа с данными

main threadself.view.frame = ...

addSubview

presentModalViewController

background threads

download file

copy file

Главный и фоновый потоки

unzip folder

Page 15: Школа-студия разработки для iOS. Лекция 4. Работа с данными

Через селекторы- (void)updateUI{ NSLog(@"update");}

- (void)doSomething{ NSLog(@"test"); [self performSelectorOnMainThread:@selector(updateUI) withObject:nil waitUntilDone:NO];}

- (void)viewDidLoad{ [super viewDidLoad]; [self performSelectorInBackground:@selector(doSomething) withObject:nil];}

Page 16: Школа-студия разработки для iOS. Лекция 4. Работа с данными

- (void)updateWithString:(NSString *)str{ NSLog(@"update %@", str);}

- (void)doSomething:(NSString *)str{ NSLog(@"test %@", str); [self performSelectorOnMainThread:@selector(updateUI:) withObject:str waitUntilDone:NO];}

- (void)viewDidLoad{ [super viewDidLoad]; [self performSelectorInBackground:@selector(doSomething:) withObject:@"blabla"];}

Page 17: Школа-студия разработки для iOS. Лекция 4. Работа с данными

Grand Central Dispatch

- (void)viewDidLoad{ [super viewDidLoad];

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ // ... NSLog(@"blabla"); dispatch_async(dispatch_get_main_queue(), ^{ // ... NSLog(@"blabla"); }); });}

Page 18: Школа-студия разработки для iOS. Лекция 4. Работа с данными

NSOperationQueueNSOperationQueue *queue = [[NSOperationQueue alloc] init];queue.maxConcurrentOperationCount = 2;

[queue addOperationWithBlock:^{ // do something 1}];

[queue addOperationWithBlock:^{ // do something 2}];

[queue addOperationWithBlock:^{ // do something 3}]; [queue waitUntilAllOperationsAreFinished];

Page 19: Школа-студия разработки для iOS. Лекция 4. Работа с данными

NSOperation@interface DownloadFileOperation : NSOperation

- (id)initWithURL:(NSString *)url;

@end@interface DownloadFileOperation()

@property(strong, nonatomic) NSString *url;

@end

@implementation DownloadFileOperation

@synthesize url = _url;

- (id)initWithURL:(NSString *)url{ self = [super init]; if (self) { self.url= url; } return self;}

- (void)main{ // ... download}

@end

Page 20: Школа-студия разработки для iOS. Лекция 4. Работа с данными

NSOperationQueue *queue = [[NSOperationQueue alloc] init];queue.maxConcurrentOperationCount = 2;

DownloadFileOperation *o1 = [[DownloadFileOperation alloc] initWithURL:@"http://test.ru/text1.txt"];DownloadFileOperation *o2 = [[DownloadFileOperation alloc] initWithURL:@"http://test.ru/text2.txt"];DownloadFileOperation *o3 = [[DownloadFileOperation alloc] initWithURL:@"http://test.ru/text3.txt"];

[queue addOperation:o1];[queue addOperation:o2];[queue addOperation:o3]; [queue waitUntilAllOperationsAreFinished];

Page 21: Школа-студия разработки для iOS. Лекция 4. Работа с данными

Блокировка- (void)doSomething1{ // ... @synchronized(self) { // ... }}

- (void)doSomething2{ // ... @synchronized(self) { // ... }}

- (void)viewDidLoad{ [super viewDidLoad]; [self performSelectorInBackground:@selector(doSomething1) withObject:nil]; [self performSelectorInBackground:@selector(doSomething2) withObject:nil];}

Page 22: Школа-студия разработки для iOS. Лекция 4. Работа с данными

Работа с файлами

Page 23: Школа-студия разработки для iOS. Лекция 4. Работа с данными

NSFileManager - удалять, копировать файлы и т.д.

- (BOOL)removeItemAtPath:(NSString *)path error:(NSError **)error;

- (BOOL)fileExistsAtPath:(NSString *)path;

NSData - бинарные данные

- (BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile;

NSString - текстовые данные

+ (id)stringWithContentsOfFile:(NSString *)path encoding:(NSStringEncoding)enc error:(NSError **)error;

Page 24: Школа-студия разработки для iOS. Лекция 4. Работа с данными

Папки

Файл поставляется вместе с приложением

NSString *path = [[NSBundle mainBundle] pathForResource:@"data" ofType:@"txt"];

Корневая папка bundle

NSString *path = [[NSBundle mainBundle] bundlePath];

Page 25: Школа-студия разработки для iOS. Лекция 4. Работа с данными

ПапкиПапка Documents (для долгого хранения)

NSString *path = [NSSearchPathForDirectoriesInDomains( NSCachesDirectory, NSUserDomainMask, YES) lastObject];

Папка Caches (для хранения кеша)

NSString *path = [NSSearchPathForDirectoriesInDomains( NSDocumentDirectory, NSUserDomainMask, YES) lastObject];

Page 26: Школа-студия разработки для iOS. Лекция 4. Работа с данными

NSData *data = ... NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];

NSString *dataPath = [path stringByAppendingPathComponent:@"data"];

[NSFileManager.defaultManager createDirectoryAtPath:path withIntermediateDirectories:YES attributes:nil error:nil];

NSString *filePath = [dataPath stringByAppendingPathComponent:@"file.txt"];[data writeToFile:filePath atomically:NO]; NSString *filePath2 = [dataPath stringByAppendingPathComponent:@"file2.txt"]; [NSFileManager.defaultManager copyItemAtPath:filePath toPath:filePath2 error:nil];

[NSFileManager.defaultManager removeItemAtPath:filePath error:nil];

Page 27: Школа-студия разработки для iOS. Лекция 4. Работа с данными

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

Page 29: Школа-студия разработки для iOS. Лекция 4. Работа с данными

GET

POST

http://site.ru/request.php?param1=test&param2=123

http://site.ru/request.phpТело запроса:

<request query="load-courses"><courses query="create">

<course id="100"/> <course id="312"/>

</courses >< /request >

Page 30: Школа-студия разработки для iOS. Лекция 4. Работа с данными

XMLhttp://ru.wikipedia.org/wiki/XML

<?xml version="1.0" encoding="UTF-8"?><recipe name="хлеб" preptime="5" cooktime="180"> <title>Простой хлеб</title> <ingredient amount="3" unit="стакан">Мука</ingredient> <ingredient amount="0.25" unit="грамм">Дрожжи</ingredient> <ingredient amount="1.5" unit="стакан">Тёплая вода</ingredient> <ingredient amount="1" unit="чайная ложка">Соль</ingredient> <instructions> <step>Смешать все ингредиенты и тщательно замесить.</step> <step>Закрыть тканью и оставить на один час в тёплом помещении.</step> <!-- <step>Почитать вчерашнюю газету.</step> - это сомнительный шаг... --> <step>Замесить ещё раз, положить на противень и поставить в духовку.</step> </instructions></recipe>

Page 31: Школа-студия разработки для iOS. Лекция 4. Работа с данными

SAX DOM

NSXMLParser KissXML

TouchXML

GData DOM Parser

libxml2 libxml2

Парсеры

http://www.raywenderlich.com/553/how-to-chose-the-best-xml-parser-for-your-iphone-project

Page 32: Школа-студия разработки для iOS. Лекция 4. Работа с данными

JSONhttp://ru.wikipedia.org/wiki/

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

Page 33: Школа-студия разработки для iOS. Лекция 4. Работа с данными

ПарсерыJSONKit

SBJSON

TouchJSON

NSJSONSerialization (iOS5)

http://stackoverflow.com/questions/2256625/comparison-of-json-parser-for-objective-c-json-framework-yajl-touchjson-etc

Page 34: Школа-студия разработки для iOS. Лекция 4. Работа с данными

Get-запрос

NSURL *url = [NSURL URLWithString:@"http://site.ru/request.php?param=1"];

NSString *result = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];

Page 35: Школа-студия разработки для iOS. Лекция 4. Работа с данными

POST-запросNSURL *url = [NSURL URLWithString:@"http://site.ru/request.php"];NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

request.HTTPMethod = @"POST";NSString *request = @"текст запроса";request.HTTPBody = [request dataUsingEncoding:NSUTF8StringEncoding];

NSData *resultData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];

NSString *resultString = [[NSString alloc] initWithData:resultData encoding:NSUTF8StringEncoding];

Page 36: Школа-студия разработки для iOS. Лекция 4. Работа с данными

Загрузка файлов

ASIHTTPRequesthttps://github.com/pokeb/asi-http-request

Page 37: Школа-студия разработки для iOS. Лекция 4. Работа с данными

Серверная часть

• Xостинг + скрипты на Python, PHP, Ruby.

• Облако + скрипты (Google App Engine, Amazon EC, Microsoft Azure и т.д.)

• Облачная NoSQL база без скриптов (Amazon SimpleDB, MongoDB и т.д.)

• Сторонние сервисы (Parse, ...)

Page 38: Школа-студия разработки для iOS. Лекция 4. Работа с данными

RESThttp://ru.wikipedia.org/wiki/REST

• Сервер не держит сессию с клиентом, не хранит состояние.

• Каждый запрос от клиента содержит всю нужную информацию для ответа.

• Запросы кешируемы

• …

Page 39: Школа-студия разработки для iOS. Лекция 4. Работа с данными

Parse http://parse.com

Page 40: Школа-студия разработки для iOS. Лекция 4. Работа с данными

Работа с сетью(демонстрация)

Page 41: Школа-студия разработки для iOS. Лекция 4. Работа с данными

Внутренняя база данных

Page 42: Школа-студия разработки для iOS. Лекция 4. Работа с данными

NSUserDefaults

[NSUserDefaults.standardUserDefaults setObject:@"Value" forKey:@"Key"];[NSUserDefaults.standardUserDefaults setInteger:10 forKey:@"Integer"];[NSUserDefaults.standardUserDefaults synchronize];

NSInteger integer = [NSUserDefaults.standardUserDefaults integerForKey:@"Integer"];NSString *value = [NSUserDefaults.standardUserDefaults objectForKey:@"Key"];

Page 43: Школа-студия разработки для iOS. Лекция 4. Работа с данными

SQLite

• Работа напрямую через API на Си

• Использование сторонних ORM на Objective-C

• CoreData (ORM от Apple)

Встраиваемая база данных с поддержкой SQL-синтаксиса.

Page 44: Школа-студия разработки для iOS. Лекция 4. Работа с данными

CoreData(демонстрация)

Page 45: Школа-студия разработки для iOS. Лекция 4. Работа с данными

Вспоминаем

Page 46: Школа-студия разработки для iOS. Лекция 4. Работа с данными

Как запустить фоновый поток?

Page 47: Школа-студия разработки для iOS. Лекция 4. Работа с данными

Как запустить фоновый поток?

- через performSelectorInBackground- через GCD- можно добавить задачу в очередь

Page 48: Школа-студия разработки для iOS. Лекция 4. Работа с данными

Как из фонового потока изменить интерфейс?

Page 49: Школа-студия разработки для iOS. Лекция 4. Работа с данными

Как из фонового потока изменить интерфейс?

- через performSelectorOnMainThread- через GCD запустить в главном потоке

Page 50: Школа-студия разработки для iOS. Лекция 4. Работа с данными

Как загрузить большой файл, отображая прогресс на экране?

Page 51: Школа-студия разработки для iOS. Лекция 4. Работа с данными

Как загрузить большой файл, отображая прогресс на экране?

Проще всего воспользоваться сторонней библиотекой, например, ASIHTTPRequest

Page 52: Школа-студия разработки для iOS. Лекция 4. Работа с данными

Сколько нужно создавать экземпляров

NSManagedObjectContext при работе с CoreData?

Page 53: Школа-студия разработки для iOS. Лекция 4. Работа с данными

Сколько нужно создавать экземпляров

NSManagedObjectContext при работе с CoreData?

Столько же, сколько потоков.