SlideShare una empresa de Scribd logo
1 de 54
Descargar para leer sin conexión
Разработка приложений для iOS




          Лекция 4
 Работа с данными



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

•   насчет иконок в tabBar
                                       http://glyphish.com/
•   стрелки в таблице
Стрелки в ячейках
Варианты хранения данных?
Яндекс.Карты
Аудиокнига
Аудиокнига с
возможностью
   покупки
Новости
Новости с
 возможностью
оффлайн чтения
Лекции и тесты
10 000 магазинов
   сразу после
    установки
   программы
•   Файлы (загружаются из сети или поставляются
    вместе с приложением)
•   Данные загружаются из сети в память и нигде
    не сохраняются
•   Данные загружаются из сети, кешируются на
    какое-то время
•   Данные загружаются из сети, сохраняются в
    базу данных
•   База данных поставляется вместе с
    приложением
Работа с потоками
Главный и фоновый потоки

background
  threads                   copy file



                                                                         unzip folder
           download file




                                            presentModalViewController
    self.view.frame = ...
                               addSubview                                main thread
Через селекторы
- (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");
        });
    });
}
NSOperationQueue
NSOperationQueue *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;
                                     @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
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(
                                                         NSDocumentDirectory,
                                                         NSUserDomainMask, YES)
                  lastObject];




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

NSString *path = [NSSearchPathForDirectoriesInDomains(
                                                         NSCachesDirectory,
                                                         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];
Работа с сетью
http://site.ru/app/request.php?cmd=get_news



                 Запрос



                    Ответ
GET
http://site.ru/request.php?param1=test&param2=123

          POST
http://site.ru/request.php
                             Тело запроса:
                  <request query="load-courses">
                     <courses query="create">
                         <course id="100"/>	

                         <course id="312"/>	

                     </courses >
                  < /request >
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>
Парсеры
  SAX                                                                DOM
  libxml2                                                             libxml2

NSXMLParser                                                         KissXML

                                                                  TouchXML

                                                         GData DOM Parser
  http://www.raywenderlich.com/553/how-to-chose-the-best-xml-parser-for-your-iphone-project
JSON
http://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];
Загрузка файлов



     ASIHTTPRequest
https://github.com/pokeb/asi-http-request
Серверная часть

• Xостинг + скрипты на Python, PHP, Ruby.
• Облако + скрипты (Google App Engine,
  Amazon EC, Microsoft Azure и т.д.)
• Облачная NoSQL база без скриптов
  (Amazon SimpleDB, MongoDB и т.д.)
• Сторонние сервисы (Parse, ...)
REST
         http://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
Встраиваемая база данных с поддержкой SQL-синтаксиса.




 • Работа напрямую через API на Си
 • Использование сторонних ORM на
    Objective-C
 • CoreData (ORM от Apple)
CoreData
(демонстрация)
Вспоминаем
Как запустить фоновый поток?
Как запустить фоновый поток?

   - через performSelectorInBackground
   - через GCD
   - можно добавить задачу в очередь
Как из фонового потока изменить
          интерфейс?
Как из фонового потока изменить
          интерфейс?

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


 Проще всего воспользоваться сторонней
 библиотекой, например, ASIHTTPRequest
Сколько нужно создавать
       экземпляров
NSManagedObjectContext при
    работе с CoreData?
Сколько нужно создавать
       экземпляров
NSManagedObjectContext при
    работе с CoreData?

    Столько же, сколько потоков.
Спасибо
     Глеб Тарасов
     gleb34@gmail.com
     twitter.com/pilot34

Más contenido relacionado

La actualidad más candente

Живые приложения с Rx
Живые приложения с RxЖивые приложения с Rx
Живые приложения с RxGoSharp
 
Web осень 2013 лекция 3
Web осень 2013 лекция 3Web осень 2013 лекция 3
Web осень 2013 лекция 3Technopark
 
Влад Ковташ — Yap Database
Влад Ковташ — Yap DatabaseВлад Ковташ — Yap Database
Влад Ковташ — Yap DatabaseCocoaHeads
 
Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)
Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)
Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)Yandex
 
RDSDataSource: Promises
RDSDataSource: PromisesRDSDataSource: Promises
RDSDataSource: PromisesRAMBLER&Co
 
Web осень 2013 лекция 9
Web осень 2013 лекция 9Web осень 2013 лекция 9
Web осень 2013 лекция 9Technopark
 
Drupal 7 и history.js или как ajax инфицировать сайт
Drupal 7 и history.js или как ajax инфицировать сайтDrupal 7 и history.js или как ajax инфицировать сайт
Drupal 7 и history.js или как ajax инфицировать сайтDrupalCamp Kyiv Рысь
 
константин лебедев
константин лебедевконстантин лебедев
константин лебедевkuchinskaya
 
FrontTalks: Константин Лебедев (Mail.ru), File API: обработка файлов на клиен...
FrontTalks: Константин Лебедев (Mail.ru), File API: обработка файлов на клиен...FrontTalks: Константин Лебедев (Mail.ru), File API: обработка файлов на клиен...
FrontTalks: Константин Лебедев (Mail.ru), File API: обработка файлов на клиен...Yandex
 
вебинар - функциональное тестирование с использованием Selenium 2 и TestNG
вебинар - функциональное тестирование с использованием Selenium 2 и TestNGвебинар - функциональное тестирование с использованием Selenium 2 и TestNG
вебинар - функциональное тестирование с использованием Selenium 2 и TestNGAndrey Rebrov
 
MongoDB - About Performance Optimization, Ivan Griga - Smart Gamma
MongoDB - About Performance Optimization, Ivan Griga - Smart GammaMongoDB - About Performance Optimization, Ivan Griga - Smart Gamma
MongoDB - About Performance Optimization, Ivan Griga - Smart GammaEvgeniy Kuzmin
 
Ice Php Framework Preview Release
Ice Php Framework Preview ReleaseIce Php Framework Preview Release
Ice Php Framework Preview ReleaseDenis Shestakov
 
JavaScript-библиотека
JavaScript-библиотекаJavaScript-библиотека
JavaScript-библиотекаVasya Petrov
 
Java tricks for high-load server programming
Java tricks for high-load server programmingJava tricks for high-load server programming
Java tricks for high-load server programmingAndrei Pangin
 
JavaScript Базовый. Занятие 07.
JavaScript Базовый. Занятие 07.JavaScript Базовый. Занятие 07.
JavaScript Базовый. Занятие 07.Igor Shkulipa
 
Something about Golang
Something about GolangSomething about Golang
Something about GolangAnton Arhipov
 
Active Record for CoreData
Active Record for CoreDataActive Record for CoreData
Active Record for CoreDataDmitriy Kuragin
 

La actualidad más candente (20)

Живые приложения с Rx
Живые приложения с RxЖивые приложения с Rx
Живые приложения с Rx
 
Web осень 2013 лекция 3
Web осень 2013 лекция 3Web осень 2013 лекция 3
Web осень 2013 лекция 3
 
Влад Ковташ — Yap Database
Влад Ковташ — Yap DatabaseВлад Ковташ — Yap Database
Влад Ковташ — Yap Database
 
Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)
Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)
Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)
 
Асинхронный JavaScript
Асинхронный JavaScriptАсинхронный JavaScript
Асинхронный JavaScript
 
RDSDataSource: Promises
RDSDataSource: PromisesRDSDataSource: Promises
RDSDataSource: Promises
 
Drupal 7 and History.js
Drupal 7 and History.jsDrupal 7 and History.js
Drupal 7 and History.js
 
Web осень 2013 лекция 9
Web осень 2013 лекция 9Web осень 2013 лекция 9
Web осень 2013 лекция 9
 
Drupal 7 и history.js или как ajax инфицировать сайт
Drupal 7 и history.js или как ajax инфицировать сайтDrupal 7 и history.js или как ajax инфицировать сайт
Drupal 7 и history.js или как ajax инфицировать сайт
 
константин лебедев
константин лебедевконстантин лебедев
константин лебедев
 
FrontTalks: Константин Лебедев (Mail.ru), File API: обработка файлов на клиен...
FrontTalks: Константин Лебедев (Mail.ru), File API: обработка файлов на клиен...FrontTalks: Константин Лебедев (Mail.ru), File API: обработка файлов на клиен...
FrontTalks: Константин Лебедев (Mail.ru), File API: обработка файлов на клиен...
 
вебинар - функциональное тестирование с использованием Selenium 2 и TestNG
вебинар - функциональное тестирование с использованием Selenium 2 и TestNGвебинар - функциональное тестирование с использованием Selenium 2 и TestNG
вебинар - функциональное тестирование с использованием Selenium 2 и TestNG
 
MongoDB - About Performance Optimization, Ivan Griga - Smart Gamma
MongoDB - About Performance Optimization, Ivan Griga - Smart GammaMongoDB - About Performance Optimization, Ivan Griga - Smart Gamma
MongoDB - About Performance Optimization, Ivan Griga - Smart Gamma
 
Ice Php Framework Preview Release
Ice Php Framework Preview ReleaseIce Php Framework Preview Release
Ice Php Framework Preview Release
 
JavaScript-библиотека
JavaScript-библиотекаJavaScript-библиотека
JavaScript-библиотека
 
Java tricks for high-load server programming
Java tricks for high-load server programmingJava tricks for high-load server programming
Java tricks for high-load server programming
 
JavaScript Базовый. Занятие 07.
JavaScript Базовый. Занятие 07.JavaScript Базовый. Занятие 07.
JavaScript Базовый. Занятие 07.
 
Something about Golang
Something about GolangSomething about Golang
Something about Golang
 
msumobi2. Лекция 2
msumobi2. Лекция 2msumobi2. Лекция 2
msumobi2. Лекция 2
 
Active Record for CoreData
Active Record for CoreDataActive Record for CoreData
Active Record for CoreData
 

Destacado

"Удобный и расширяемый роутинг в iOS-приложении" Тимур Юсипов (Avito)
"Удобный и расширяемый роутинг в iOS-приложении" Тимур  Юсипов (Avito)"Удобный и расширяемый роутинг в iOS-приложении" Тимур  Юсипов (Avito)
"Удобный и расширяемый роутинг в iOS-приложении" Тимур Юсипов (Avito)AvitoTech
 
Pure Coordination Using the Coordinator-Configurator Pattern
Pure Coordination Using the Coordinator-Configurator PatternPure Coordination Using the Coordinator-Configurator Pattern
Pure Coordination Using the Coordinator-Configurator PatternSerge Stinckwich
 
Первое приложение для iPhone
Первое приложение для iPhoneПервое приложение для iPhone
Первое приложение для iPhoneГлеб Тарасов
 
Курсы по мобильной разработке под iOS. 4 лекция. Возможности телефона
Курсы по мобильной разработке под iOS. 4 лекция. Возможности телефонаКурсы по мобильной разработке под iOS. 4 лекция. Возможности телефона
Курсы по мобильной разработке под iOS. 4 лекция. Возможности телефонаГлеб Тарасов
 
Курсы по мобильной разработке под iOS. 5 лекция. Работа с данными
Курсы по мобильной разработке под iOS. 5 лекция. Работа с даннымиКурсы по мобильной разработке под iOS. 5 лекция. Работа с данными
Курсы по мобильной разработке под iOS. 5 лекция. Работа с даннымиГлеб Тарасов
 
Курсы по мобильной разработке. 1 лекция. Знакомство с iOS
Курсы по мобильной разработке. 1 лекция. Знакомство с iOSКурсы по мобильной разработке. 1 лекция. Знакомство с iOS
Курсы по мобильной разработке. 1 лекция. Знакомство с iOSГлеб Тарасов
 
Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др.
Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др.Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др.
Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др.Глеб Тарасов
 
Интуит. Разработка приложений для iOS. Лекция 5. Сложные Views
Интуит. Разработка приложений для iOS. Лекция 5. Сложные ViewsИнтуит. Разработка приложений для iOS. Лекция 5. Сложные Views
Интуит. Разработка приложений для iOS. Лекция 5. Сложные ViewsГлеб Тарасов
 
Rambler.iOS #6: App delegate - разделяй и властвуй
Rambler.iOS #6: App delegate - разделяй и властвуйRambler.iOS #6: App delegate - разделяй и властвуй
Rambler.iOS #6: App delegate - разделяй и властвуйRAMBLER&Co
 

Destacado (10)

"Удобный и расширяемый роутинг в iOS-приложении" Тимур Юсипов (Avito)
"Удобный и расширяемый роутинг в iOS-приложении" Тимур  Юсипов (Avito)"Удобный и расширяемый роутинг в iOS-приложении" Тимур  Юсипов (Avito)
"Удобный и расширяемый роутинг в iOS-приложении" Тимур Юсипов (Avito)
 
Pure Coordination Using the Coordinator-Configurator Pattern
Pure Coordination Using the Coordinator-Configurator PatternPure Coordination Using the Coordinator-Configurator Pattern
Pure Coordination Using the Coordinator-Configurator Pattern
 
Первое приложение для iPhone
Первое приложение для iPhoneПервое приложение для iPhone
Первое приложение для iPhone
 
Курсы по мобильной разработке под iOS. 4 лекция. Возможности телефона
Курсы по мобильной разработке под iOS. 4 лекция. Возможности телефонаКурсы по мобильной разработке под iOS. 4 лекция. Возможности телефона
Курсы по мобильной разработке под iOS. 4 лекция. Возможности телефона
 
Курсы по мобильной разработке под iOS. 5 лекция. Работа с данными
Курсы по мобильной разработке под iOS. 5 лекция. Работа с даннымиКурсы по мобильной разработке под iOS. 5 лекция. Работа с данными
Курсы по мобильной разработке под iOS. 5 лекция. Работа с данными
 
Курсы по мобильной разработке. 1 лекция. Знакомство с iOS
Курсы по мобильной разработке. 1 лекция. Знакомство с iOSКурсы по мобильной разработке. 1 лекция. Знакомство с iOS
Курсы по мобильной разработке. 1 лекция. Знакомство с iOS
 
Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др.
Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др.Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др.
Интуит. Разработка приложений для iOS. Лекция 12. Тестирование, публикация и др.
 
Gleb Tarasov. Portfolio
Gleb Tarasov. PortfolioGleb Tarasov. Portfolio
Gleb Tarasov. Portfolio
 
Интуит. Разработка приложений для iOS. Лекция 5. Сложные Views
Интуит. Разработка приложений для iOS. Лекция 5. Сложные ViewsИнтуит. Разработка приложений для iOS. Лекция 5. Сложные Views
Интуит. Разработка приложений для iOS. Лекция 5. Сложные Views
 
Rambler.iOS #6: App delegate - разделяй и властвуй
Rambler.iOS #6: App delegate - разделяй и властвуйRambler.iOS #6: App delegate - разделяй и властвуй
Rambler.iOS #6: App delegate - разделяй и властвуй
 

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

хранение данных
хранение данныххранение данных
хранение данныхNoveo
 
Перспективы функционального подхода
Перспективы функционального подходаПерспективы функционального подхода
Перспективы функционального подходаIgor Kashkuta
 
7 кашкута
7 кашкута7 кашкута
7 кашкутаCodeFest
 
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...Andrey Rebrov
 
Школа-студия разработки приложений для iOS. Лекция 1. Objective-C
Школа-студия разработки приложений для iOS. Лекция 1. Objective-CШкола-студия разработки приложений для iOS. Лекция 1. Objective-C
Школа-студия разработки приложений для iOS. Лекция 1. Objective-CГлеб Тарасов
 
C#. От основ к эффективному коду
C#. От основ к эффективному кодуC#. От основ к эффективному коду
C#. От основ к эффективному кодуVasiliy Deynega
 
2-е занятие курса iPhone разработки в ГУ-ВШЭ
2-е занятие курса iPhone разработки в ГУ-ВШЭ2-е занятие курса iPhone разработки в ГУ-ВШЭ
2-е занятие курса iPhone разработки в ГУ-ВШЭOleg Parinov
 
Владимир Горбенко «Использование блоков в Objective-C»
Владимир Горбенко «Использование блоков в Objective-C»Владимир Горбенко «Использование блоков в Objective-C»
Владимир Горбенко «Использование блоков в Objective-C»e-Legion
 
RxJava + Retrofit
RxJava + RetrofitRxJava + Retrofit
RxJava + RetrofitDev2Dev
 
Functional Reactive Programming
Functional Reactive ProgrammingFunctional Reactive Programming
Functional Reactive ProgrammingSerg Buglakov
 
WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов
WebCamp: Developer Day: Parse'им бэкенд - Аким ХалиловWebCamp: Developer Day: Parse'им бэкенд - Аким Халилов
WebCamp: Developer Day: Parse'им бэкенд - Аким ХалиловGeeksLab Odessa
 
Интуит. Разработка приложений для iOS. Лекция 2. Objective-C
Интуит. Разработка приложений для iOS. Лекция 2. Objective-CИнтуит. Разработка приложений для iOS. Лекция 2. Objective-C
Интуит. Разработка приложений для iOS. Лекция 2. Objective-CГлеб Тарасов
 
Behat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и MinkBehat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и Minktyomo4ka
 
Разработка крупного Standalone проекта на юнити: улучшаем производительность
Разработка крупного Standalone проекта на юнити: улучшаем производительностьРазработка крупного Standalone проекта на юнити: улучшаем производительность
Разработка крупного Standalone проекта на юнити: улучшаем производительностьВадим Воробьев
 
Интеграция Яндекс Сервер
Интеграция Яндекс СерверИнтеграция Яндекс Сервер
Интеграция Яндекс СерверPVasili
 

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

хранение данных
хранение данныххранение данных
хранение данных
 
Перспективы функционального подхода
Перспективы функционального подходаПерспективы функционального подхода
Перспективы функционального подхода
 
7 кашкута
7 кашкута7 кашкута
7 кашкута
 
msumobi2. Лекция 1
msumobi2. Лекция 1msumobi2. Лекция 1
msumobi2. Лекция 1
 
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
 
Школа-студия разработки приложений для iOS. Лекция 1. Objective-C
Школа-студия разработки приложений для iOS. Лекция 1. Objective-CШкола-студия разработки приложений для iOS. Лекция 1. Objective-C
Школа-студия разработки приложений для iOS. Лекция 1. Objective-C
 
Squeek school #6
Squeek school #6Squeek school #6
Squeek school #6
 
Jsfwdays 2013-2
Jsfwdays 2013-2Jsfwdays 2013-2
Jsfwdays 2013-2
 
Js fuckworks
Js fuckworksJs fuckworks
Js fuckworks
 
C#. От основ к эффективному коду
C#. От основ к эффективному кодуC#. От основ к эффективному коду
C#. От основ к эффективному коду
 
2-е занятие курса iPhone разработки в ГУ-ВШЭ
2-е занятие курса iPhone разработки в ГУ-ВШЭ2-е занятие курса iPhone разработки в ГУ-ВШЭ
2-е занятие курса iPhone разработки в ГУ-ВШЭ
 
Владимир Горбенко «Использование блоков в Objective-C»
Владимир Горбенко «Использование блоков в Objective-C»Владимир Горбенко «Использование блоков в Objective-C»
Владимир Горбенко «Использование блоков в Objective-C»
 
RxJava + Retrofit
RxJava + RetrofitRxJava + Retrofit
RxJava + Retrofit
 
Functional Reactive Programming
Functional Reactive ProgrammingFunctional Reactive Programming
Functional Reactive Programming
 
Yserver
YserverYserver
Yserver
 
WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов
WebCamp: Developer Day: Parse'им бэкенд - Аким ХалиловWebCamp: Developer Day: Parse'им бэкенд - Аким Халилов
WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов
 
Интуит. Разработка приложений для iOS. Лекция 2. Objective-C
Интуит. Разработка приложений для iOS. Лекция 2. Objective-CИнтуит. Разработка приложений для iOS. Лекция 2. Objective-C
Интуит. Разработка приложений для iOS. Лекция 2. Objective-C
 
Behat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и MinkBehat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и Mink
 
Разработка крупного Standalone проекта на юнити: улучшаем производительность
Разработка крупного Standalone проекта на юнити: улучшаем производительностьРазработка крупного Standalone проекта на юнити: улучшаем производительность
Разработка крупного Standalone проекта на юнити: улучшаем производительность
 
Интеграция Яндекс Сервер
Интеграция Яндекс СерверИнтеграция Яндекс Сервер
Интеграция Яндекс Сервер
 

Más de Глеб Тарасов

Интуит. Разработка приложений для iOS. Лекция 11. Расширенные возможности уст...
Интуит. Разработка приложений для iOS. Лекция 11. Расширенные возможности уст...Интуит. Разработка приложений для iOS. Лекция 11. Расширенные возможности уст...
Интуит. Разработка приложений для iOS. Лекция 11. Расширенные возможности уст...Глеб Тарасов
 
Интуит. Разработка приложений для iOS. Лекция 10. Поддержка iPad
Интуит. Разработка приложений для iOS. Лекция 10. Поддержка iPadИнтуит. Разработка приложений для iOS. Лекция 10. Поддержка iPad
Интуит. Разработка приложений для iOS. Лекция 10. Поддержка iPadГлеб Тарасов
 
Интуит. Разработка приложений для iOS. Лекция 9. Нестандартный интерфейс
Интуит. Разработка приложений для iOS. Лекция 9. Нестандартный интерфейсИнтуит. Разработка приложений для iOS. Лекция 9. Нестандартный интерфейс
Интуит. Разработка приложений для iOS. Лекция 9. Нестандартный интерфейсГлеб Тарасов
 
Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетью
Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетьюИнтуит. Разработка приложений для iOS. Лекция 7. Работа с сетью
Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетьюГлеб Тарасов
 
Интуит. Разработка приложений для iOS. Лекция 4. Controllers
Интуит. Разработка приложений для iOS. Лекция 4. ControllersИнтуит. Разработка приложений для iOS. Лекция 4. Controllers
Интуит. Разработка приложений для iOS. Лекция 4. ControllersГлеб Тарасов
 
Интуит. Разработка приложений для iOS. Лекция 3. Views
Интуит. Разработка приложений для iOS. Лекция 3. ViewsИнтуит. Разработка приложений для iOS. Лекция 3. Views
Интуит. Разработка приложений для iOS. Лекция 3. ViewsГлеб Тарасов
 
Интуит. Разработка приложений для iOS. Лекция 1. Знакомство.
Интуит. Разработка приложений для iOS. Лекция 1. Знакомство.Интуит. Разработка приложений для iOS. Лекция 1. Знакомство.
Интуит. Разработка приложений для iOS. Лекция 1. Знакомство.Глеб Тарасов
 
Презентация проекта Ulect
Презентация проекта Ulect Презентация проекта Ulect
Презентация проекта Ulect Глеб Тарасов
 
Презентация для Foundation Institute
Презентация для Foundation InstituteПрезентация для Foundation Institute
Презентация для Foundation InstituteГлеб Тарасов
 
Делаем жизнь лучше с CocoaPods
Делаем жизнь лучше с CocoaPodsДелаем жизнь лучше с CocoaPods
Делаем жизнь лучше с CocoaPodsГлеб Тарасов
 
Школа-Студия разработки приложений для iOS. 5 лекция. Разное
Школа-Студия разработки приложений для iOS. 5 лекция. РазноеШкола-Студия разработки приложений для iOS. 5 лекция. Разное
Школа-Студия разработки приложений для iOS. 5 лекция. РазноеГлеб Тарасов
 
Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение
Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжениеШкола-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение
Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжениеГлеб Тарасов
 
Школа-студия разработки приложений для iOS. 2 лекция. MVC, View, Controllers
Школа-студия разработки приложений для iOS. 2 лекция. MVC, View, ControllersШкола-студия разработки приложений для iOS. 2 лекция. MVC, View, Controllers
Школа-студия разработки приложений для iOS. 2 лекция. MVC, View, ControllersГлеб Тарасов
 
Глеб Тарасов. Портфолио
Глеб Тарасов. ПортфолиоГлеб Тарасов. Портфолио
Глеб Тарасов. ПортфолиоГлеб Тарасов
 
Курсы по мобильной разработке под iOS. 6 лекция. Инструменты
Курсы по мобильной разработке под iOS. 6 лекция. ИнструментыКурсы по мобильной разработке под iOS. 6 лекция. Инструменты
Курсы по мобильной разработке под iOS. 6 лекция. ИнструментыГлеб Тарасов
 
Курсы по мобильной разработке. 3 лекция. Сложные интерфейсы.
Курсы по мобильной разработке. 3 лекция. Сложные интерфейсы.Курсы по мобильной разработке. 3 лекция. Сложные интерфейсы.
Курсы по мобильной разработке. 3 лекция. Сложные интерфейсы.Глеб Тарасов
 
Курсы по мобильной разработке. 2 лекция. Построение интерфейсов в iOS
Курсы по мобильной разработке. 2 лекция. Построение интерфейсов в iOSКурсы по мобильной разработке. 2 лекция. Построение интерфейсов в iOS
Курсы по мобильной разработке. 2 лекция. Построение интерфейсов в iOSГлеб Тарасов
 

Más de Глеб Тарасов (18)

Интуит. Разработка приложений для iOS. Лекция 11. Расширенные возможности уст...
Интуит. Разработка приложений для iOS. Лекция 11. Расширенные возможности уст...Интуит. Разработка приложений для iOS. Лекция 11. Расширенные возможности уст...
Интуит. Разработка приложений для iOS. Лекция 11. Расширенные возможности уст...
 
Интуит. Разработка приложений для iOS. Лекция 10. Поддержка iPad
Интуит. Разработка приложений для iOS. Лекция 10. Поддержка iPadИнтуит. Разработка приложений для iOS. Лекция 10. Поддержка iPad
Интуит. Разработка приложений для iOS. Лекция 10. Поддержка iPad
 
Интуит. Разработка приложений для iOS. Лекция 9. Нестандартный интерфейс
Интуит. Разработка приложений для iOS. Лекция 9. Нестандартный интерфейсИнтуит. Разработка приложений для iOS. Лекция 9. Нестандартный интерфейс
Интуит. Разработка приложений для iOS. Лекция 9. Нестандартный интерфейс
 
Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетью
Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетьюИнтуит. Разработка приложений для iOS. Лекция 7. Работа с сетью
Интуит. Разработка приложений для iOS. Лекция 7. Работа с сетью
 
Интуит. Разработка приложений для iOS. Лекция 4. Controllers
Интуит. Разработка приложений для iOS. Лекция 4. ControllersИнтуит. Разработка приложений для iOS. Лекция 4. Controllers
Интуит. Разработка приложений для iOS. Лекция 4. Controllers
 
Интуит. Разработка приложений для iOS. Лекция 3. Views
Интуит. Разработка приложений для iOS. Лекция 3. ViewsИнтуит. Разработка приложений для iOS. Лекция 3. Views
Интуит. Разработка приложений для iOS. Лекция 3. Views
 
Интуит. Разработка приложений для iOS. Лекция 1. Знакомство.
Интуит. Разработка приложений для iOS. Лекция 1. Знакомство.Интуит. Разработка приложений для iOS. Лекция 1. Знакомство.
Интуит. Разработка приложений для iOS. Лекция 1. Знакомство.
 
Презентация проекта Ulect
Презентация проекта Ulect Презентация проекта Ulect
Презентация проекта Ulect
 
Презентация для Foundation Institute
Презентация для Foundation InstituteПрезентация для Foundation Institute
Презентация для Foundation Institute
 
Делаем жизнь лучше с CocoaPods
Делаем жизнь лучше с CocoaPodsДелаем жизнь лучше с CocoaPods
Делаем жизнь лучше с CocoaPods
 
Школа-Студия разработки приложений для iOS. 5 лекция. Разное
Школа-Студия разработки приложений для iOS. 5 лекция. РазноеШкола-Студия разработки приложений для iOS. 5 лекция. Разное
Школа-Студия разработки приложений для iOS. 5 лекция. Разное
 
Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение
Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжениеШкола-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение
Школа-Студия разработки приложений для iOS. 3 лекция. Интерфейсы, прололжение
 
Школа-студия разработки приложений для iOS. 2 лекция. MVC, View, Controllers
Школа-студия разработки приложений для iOS. 2 лекция. MVC, View, ControllersШкола-студия разработки приложений для iOS. 2 лекция. MVC, View, Controllers
Школа-студия разработки приложений для iOS. 2 лекция. MVC, View, Controllers
 
ShareKit. Evernote Dev Meetup
ShareKit. Evernote Dev MeetupShareKit. Evernote Dev Meetup
ShareKit. Evernote Dev Meetup
 
Глеб Тарасов. Портфолио
Глеб Тарасов. ПортфолиоГлеб Тарасов. Портфолио
Глеб Тарасов. Портфолио
 
Курсы по мобильной разработке под iOS. 6 лекция. Инструменты
Курсы по мобильной разработке под iOS. 6 лекция. ИнструментыКурсы по мобильной разработке под iOS. 6 лекция. Инструменты
Курсы по мобильной разработке под iOS. 6 лекция. Инструменты
 
Курсы по мобильной разработке. 3 лекция. Сложные интерфейсы.
Курсы по мобильной разработке. 3 лекция. Сложные интерфейсы.Курсы по мобильной разработке. 3 лекция. Сложные интерфейсы.
Курсы по мобильной разработке. 3 лекция. Сложные интерфейсы.
 
Курсы по мобильной разработке. 2 лекция. Построение интерфейсов в iOS
Курсы по мобильной разработке. 2 лекция. Построение интерфейсов в iOSКурсы по мобильной разработке. 2 лекция. Построение интерфейсов в iOS
Курсы по мобильной разработке. 2 лекция. Построение интерфейсов в iOS
 

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

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