0
Разработка приложений для iOS          Лекция 4 Работа с данными                            Глеб Тарасов
Насчет ДЗ•   для кнопки сделать базовый класс•   насчет иконок в tabBar                                       http://glyph...
Стрелки в ячейках
Варианты хранения данных?
Яндекс.Карты
Аудиокнига
Аудиокнига свозможностью   покупки
Новости
Новости с возможностьюоффлайн чтения
Лекции и тесты
10 000 магазинов   сразу после    установки   программы
•   Файлы (загружаются из сети или поставляются    вместе с приложением)•   Данные загружаются из сети в память и нигде   ...
Работа с потоками
Главный и фоновый потокиbackground  threads                   copy file                                                    ...
Через селекторы- (void)updateUI{    NSLog(@"update");}- (void)doSomething{    NSLog(@"test");    [self performSelectorOnMa...
- (void)updateWithString:(NSString *)str{    NSLog(@"update %@", str);}- (void)doSomething:(NSString *)str{    NSLog(@"tes...
Grand Central Dispatch- (void)viewDidLoad{    [super viewDidLoad];    dispatch_async(dispatch_get_global_queue(DISPATCH_QU...
NSOperationQueueNSOperationQueue *queue = [[NSOperationQueue alloc] init];queue.maxConcurrentOperationCount = 2;[queue add...
NSOperation@interface DownloadFileOperation : NSOperation- (id)initWithURL:(NSString *)url;                               ...
NSOperationQueue *queue = [[NSOperationQueue alloc] init];queue.maxConcurrentOperationCount = 2;DownloadFileOperation *o1 ...
Блокировка- (void)doSomething1{    // ...    @synchronized(self)    {        // ...    }}- (void)doSomething2{    // ...  ...
Работа с файлами
NSFileManager - удалять, копировать файлы и т.д.- (BOOL)removeItemAtPath:(NSString *)path                              err...
Папки             Файл поставляется вместе с                   приложениемNSString *path = [[NSBundle mainBundle]         ...
Папки         Папка Documents (для долгого хранения)NSString *path = [NSSearchPathForDirectoriesInDomains(                ...
NSData *data = ...NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,                              ...
Работа с сетью
http://site.ru/app/request.php?cmd=get_news                 Запрос                    Ответ
GEThttp://site.ru/request.php?param1=test&param2=123          POSThttp://site.ru/request.php                             Т...
XML        http://ru.wikipedia.org/wiki/XML<?xml version="1.0" encoding="UTF-8"?><recipe name="хлеб" preptime="5" cooktime...
Парсеры  SAX                                                                DOM  libxml2                                  ...
JSONhttp://ru.wikipedia.org/wiki/            JSON{   "firstName": "Иван",   "lastName": "Иванов",   "address": {       "st...
Парсеры                                                 JSONKit                                                 SBJSON    ...
Get-запросNSURL *url = [NSURL URLWithString:@"http://site.ru/request.php?param=1"];NSString *result = [NSString stringWith...
POST-запросNSURL *url = [NSURL URLWithString:@"http://site.ru/request.php"];NSMutableURLRequest *request = [NSMutableURLRe...
Загрузка файлов     ASIHTTPRequesthttps://github.com/pokeb/asi-http-request
Серверная часть• Xостинг + скрипты на Python, PHP, Ruby.• Облако + скрипты (Google App Engine,  Amazon EC, Microsoft Azure...
REST         http://ru.wikipedia.org/wiki/REST• Сервер не держит сессию с клиентом, не хранит  состояние.• Каждый запрос о...
Parse   http://parse.com
Работа с сетью(демонстрация)
Внутренняя база данных
NSUserDefaults[NSUserDefaults.standardUserDefaults setObject:@"Value" forKey:@"Key"];[NSUserDefaults.standardUserDefaults ...
SQLiteВстраиваемая база данных с поддержкой SQL-синтаксиса. • Работа напрямую через API на Си • Использование сторонних OR...
CoreData(демонстрация)
Вспоминаем
Как запустить фоновый поток?
Как запустить фоновый поток?   - через performSelectorInBackground   - через GCD   - можно добавить задачу в очередь
Как из фонового потока изменить          интерфейс?
Как из фонового потока изменить          интерфейс?    - через performSelectorOnMainThread    - через GCD запустить в глав...
Как загрузить большой файл,отображая прогресс на экране?
Как загрузить большой файл,отображая прогресс на экране? Проще всего воспользоваться сторонней библиотекой, например, ASIH...
Сколько нужно создавать       экземпляровNSManagedObjectContext при    работе с CoreData?
Сколько нужно создавать       экземпляровNSManagedObjectContext при    работе с CoreData?    Столько же, сколько потоков.
Спасибо     Глеб Тарасов     gleb34@gmail.com     twitter.com/pilot34
Upcoming SlideShare
Loading in...5
×

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

7,153

Published on

Published in: Education
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
7,153
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
52
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

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

  1. 1. Разработка приложений для iOS Лекция 4 Работа с данными Глеб Тарасов
  2. 2. Насчет ДЗ• для кнопки сделать базовый класс• насчет иконок в tabBar http://glyphish.com/• стрелки в таблице
  3. 3. Стрелки в ячейках
  4. 4. Варианты хранения данных?
  5. 5. Яндекс.Карты
  6. 6. Аудиокнига
  7. 7. Аудиокнига свозможностью покупки
  8. 8. Новости
  9. 9. Новости с возможностьюоффлайн чтения
  10. 10. Лекции и тесты
  11. 11. 10 000 магазинов сразу после установки программы
  12. 12. • Файлы (загружаются из сети или поставляются вместе с приложением)• Данные загружаются из сети в память и нигде не сохраняются• Данные загружаются из сети, кешируются на какое-то время• Данные загружаются из сети, сохраняются в базу данных• База данных поставляется вместе с приложением
  13. 13. Работа с потоками
  14. 14. Главный и фоновый потокиbackground threads copy file unzip folder download file presentModalViewController self.view.frame = ... addSubview main thread
  15. 15. Через селекторы- (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];}
  16. 16. - (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"];}
  17. 17. 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"); }); });}
  18. 18. 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];
  19. 19. NSOperation@interface DownloadFileOperation : NSOperation- (id)initWithURL:(NSString *)url; @interface DownloadFileOperation()@end @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
  20. 20. 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];
  21. 21. Блокировка- (void)doSomething1{ // ... @synchronized(self) { // ... }}- (void)doSomething2{ // ... @synchronized(self) { // ... }}- (void)viewDidLoad{ [super viewDidLoad]; [self performSelectorInBackground:@selector(doSomething1) withObject:nil]; [self performSelectorInBackground:@selector(doSomething2) withObject:nil];}
  22. 22. Работа с файлами
  23. 23. 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;
  24. 24. Папки Файл поставляется вместе с приложениемNSString *path = [[NSBundle mainBundle] pathForResource:@"data" ofType:@"txt"]; Корневая папка bundleNSString *path = [[NSBundle mainBundle] bundlePath];
  25. 25. Папки Папка Documents (для долгого хранения)NSString *path = [NSSearchPathForDirectoriesInDomains( NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; Папка Caches (для хранения кеша)NSString *path = [NSSearchPathForDirectoriesInDomains( NSCachesDirectory, NSUserDomainMask, YES) lastObject];
  26. 26. 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];
  27. 27. Работа с сетью
  28. 28. http://site.ru/app/request.php?cmd=get_news Запрос Ответ
  29. 29. GEThttp://site.ru/request.php?param1=test&param2=123 POSThttp://site.ru/request.php Тело запроса: <request query="load-courses"> <courses query="create"> <course id="100"/> <course id="312"/> </courses > < /request >
  30. 30. XML http://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>
  31. 31. Парсеры SAX DOM libxml2 libxml2NSXMLParser KissXML TouchXML GData DOM Parser http://www.raywenderlich.com/553/how-to-chose-the-best-xml-parser-for-your-iphone-project
  32. 32. JSONhttp://ru.wikipedia.org/wiki/ JSON{ "firstName": "Иван", "lastName": "Иванов", "address": { "streetAddress": "Московское ш.,101, кв.101", "city": "Ленинград", "postalCode": 101101 }, "phoneNumbers": [ "812 123-1234", "916 123-4567" ]}
  33. 33. Парсеры JSONKit SBJSON TouchJSON NSJSONSerialization (iOS5)http://stackoverflow.com/questions/2256625/comparison-of-json-parser-for-objective-c-json-framework-yajl-touchjson-etc
  34. 34. Get-запросNSURL *url = [NSURL URLWithString:@"http://site.ru/request.php?param=1"];NSString *result = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];
  35. 35. 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];
  36. 36. Загрузка файлов ASIHTTPRequesthttps://github.com/pokeb/asi-http-request
  37. 37. Серверная часть• Xостинг + скрипты на Python, PHP, Ruby.• Облако + скрипты (Google App Engine, Amazon EC, Microsoft Azure и т.д.)• Облачная NoSQL база без скриптов (Amazon SimpleDB, MongoDB и т.д.)• Сторонние сервисы (Parse, ...)
  38. 38. REST http://ru.wikipedia.org/wiki/REST• Сервер не держит сессию с клиентом, не хранит состояние.• Каждый запрос от клиента содержит всю нужную информацию для ответа.• Запросы кешируемы•…
  39. 39. Parse http://parse.com
  40. 40. Работа с сетью(демонстрация)
  41. 41. Внутренняя база данных
  42. 42. 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"];
  43. 43. SQLiteВстраиваемая база данных с поддержкой SQL-синтаксиса. • Работа напрямую через API на Си • Использование сторонних ORM на Objective-C • CoreData (ORM от Apple)
  44. 44. CoreData(демонстрация)
  45. 45. Вспоминаем
  46. 46. Как запустить фоновый поток?
  47. 47. Как запустить фоновый поток? - через performSelectorInBackground - через GCD - можно добавить задачу в очередь
  48. 48. Как из фонового потока изменить интерфейс?
  49. 49. Как из фонового потока изменить интерфейс? - через performSelectorOnMainThread - через GCD запустить в главном потоке
  50. 50. Как загрузить большой файл,отображая прогресс на экране?
  51. 51. Как загрузить большой файл,отображая прогресс на экране? Проще всего воспользоваться сторонней библиотекой, например, ASIHTTPRequest
  52. 52. Сколько нужно создавать экземпляровNSManagedObjectContext при работе с CoreData?
  53. 53. Сколько нужно создавать экземпляровNSManagedObjectContext при работе с CoreData? Столько же, сколько потоков.
  54. 54. Спасибо Глеб Тарасов gleb34@gmail.com twitter.com/pilot34
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×