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

Post on 04-Dec-2014

7.273 Views

Category:

Education

9 Downloads

Preview:

Click to see full reader

DESCRIPTION

 

TRANSCRIPT

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

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

Лекция 4

Глеб Тарасов

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

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

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

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

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

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

Аудиокнига

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

Новости

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

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

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

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

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

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

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

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

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

main threadself.view.frame = ...

addSubview

presentModalViewController

background threads

download file

copy file

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

unzip folder

Через селекторы- (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];}

- (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"];}

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"); }); });}

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];

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

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];

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

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

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

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

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;

Папки

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

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

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

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

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

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

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

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

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];

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

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 >

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>

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

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

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

ПарсерыJSONKit

SBJSON

TouchJSON

NSJSONSerialization (iOS5)

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

Get-запрос

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

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

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];

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

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

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

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

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

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

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

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

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

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

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

• …

Parse http://parse.com

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

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

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"];

SQLite

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

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

• CoreData (ORM от Apple)

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

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

Вспоминаем

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Спасибо

Глеб Тарасовgleb34@gmail.comtwitter.com/pilot34

top related