SlideShare a Scribd company logo
1 of 20
Download to read offline
NSIncrementalStore 
или как заставить CoreData варить ваш 
собственный кофе 
Андрей Гусев 
Ведущий разработчик iOS 
NeoSphere LLC
Получение данных с использованием CoreData 
10 
Время Загрузка Обработка и сохранение 
8
CoreData + NSIncrementalStore =
Как пользоваться 
Инициализация 
Модель базы данных 
Переопределение обязательных методов
+ (void)initialize { 
[NSPersistentStoreCoordinator registerStoreClass:self 
forStoreType:[self persistentStoreType]]; 
} 
+ (NSString *)persistentStoreType { 
return NSStringFromClass(self); 
} 
Инициализация 
[_pStoreCoordinator addPersistentStoreWithType:[MyIncrementalStore persistentStoreType] 
configuration:@"IncrementalStore" 
URL:incrementalStoreUrl 
options:nil 
error:&error]
Методы для переопределения 
- (BOOL)loadMetadata:(NSError **)error 
- (id)executeRequest:(NSPersistentStoreRequest *)request 
withContext:(NSManagedObjectContext *)context 
error:(NSError **)error 
- (NSIncrementalStoreNode *)newValuesForObjectWithID:(NSManagedObjectID *)objectID 
withContext:(NSManagedObjectContext *)context 
error:(NSError **)error; 
- (id)newValueForRelationship:(NSRelationshipDescription *)relationship 
forObjectWithID:(NSManagedObjectID *)objectID 
withContext:(NSManagedObjectContext *)context 
error:(NSError **)error; 
- (NSArray *)obtainPermanentIDsForObjects:(NSArray *)array 
error:(NSError **)error;
- (BOOL)loadMetadata:(NSError **)error { 
NSMutableDictionary *mutableMetadata = [NSMutableDictionary dictionary]; 
[mutableMetadata setValue:[[NSProcessInfo processInfo] globallyUniqueString] 
forKey:NSStoreUUIDKey]; 
[mutableMetadata setValue:[[self class] persistentStoreType] 
forKey:NSStoreTypeKey]; 
[self setMetadata:mutableMetadata]; 
return YES; 
}
- (id)executeRequest:(NSPersistentStoreRequest *)request 
withContext:(NSManagedObjectContext *)context 
error:(NSError **)error 
if (request.requestType == NSFetchRequestType) { 
NSFetchRequest *fRequest = (NSFetchRequest *)request; 
switch (fRequest.resultType) { 
case NSManagedObjectResultType: 
case NSManagedObjectIDResultType: 
{ 
/* Выборка идентификаторов объектов */ 
if (fRequest.resultType == NSManagedObjectResultType) { 
//результат - массив NSManagedObject-ов (Faults) 
} 
else { 
//результат - массив NSManagedObjectID 
} 
} 
break; 
***
- (id)executeRequest:(NSPersistentStoreRequest *)request 
withContext:(NSManagedObjectContext *)context 
error:(NSError **)error 
//Получение CoreData ObjectID для объекта 
NSManagedObjectID *oid = [self newObjectIDForEntity:entity 
referenceObject:item]; 
//Получение fault-а объекта по его CoreData ObjectID 
[context objectWithID:oid]; 
//Получение исходного referenceObject по CoreData objectID 
id item = [self referenceObjectForObjectID:oid]; 
item -> NSString или NSNumber
- (id)executeRequest:(NSPersistentStoreRequest *)request 
withContext:(NSManagedObjectContext *)context 
error:(NSError **)error 
ReferenceObject 
(item) 
NSManagedObjectID 
NSManagedObject
- (id)executeRequest:(NSPersistentStoreRequest *)request 
withContext:(NSManagedObjectContext *)context 
error:(NSError **)error 
if (request.requestType == NSFetchRequestType) { 
NSFetchRequest *fRequest = (NSFetchRequest *)request; 
switch (fRequest.resultType) { 
*** 
case NSDictionaryResultType: { 
/* Выборка значений конкретных полей */ 
//Результат - массив NSDictionary. 
//Ключи - название полей данных, значения - сами данные 
} 
break; 
case NSCountResultType: { 
/* Подсчёт количества объектов */ 
//Результат - массив, состоящий из одного NSNumber-а 
} 
break;
- (id)executeRequest:(NSPersistentStoreRequest *)request 
withContext:(NSManagedObjectContext *)context 
error:(NSError **)error 
*** 
else if (request.requestType == NSSaveRequestType) { 
/* 
Обработка NSSaveChangesRequest: 
- (NSSet *)deletedObjects 
- (NSSet *)insertedObjects 
- (NSSet *)updatedObjects 
- (NSSet *) lockedObjects 
*/ 
//результат - пустой массив. 
}
- (NSIncrementalStoreNode *)newValuesForObjectWithID:(NSManagedObjectID *)objectID 
withContext:(NSManagedObjectContext *)context 
error:(NSError **)error; 
/* Выбрать все данные для объекта с заданным ObjectID */ 
/* 
Заполнить NSDictionary полученными значениями: 
Ключ - название поля объекта в DataModel 
Значение - конкретное значение для объекта 
*/ 
return [[NSIncrementalStoreNode alloc] initWithObjectID:objectID 
withValues:objectDataDict 
version:version];
- (id)newValueForRelationship:(NSRelationshipDescription *)relationship 
forObjectWithID:(NSManagedObjectID *)objectID 
withContext:(NSManagedObjectContext *)context 
error:(NSError **)error; 
if (relationship.isToMany) { 
return [NSManagedObject, NSManagedObject, ...] или [] 
} 
else { 
return NSManagedObject или [NSNull null] 
}
- (NSArray *)obtainPermanentIDsForObjects:(NSArray *)array 
error:(NSError **)error;
Вопросы?!
Полезные ссылки 
Демонстрационное приложение: 
https://github.com/GusevAndrey/NSIncrementalStoreInUse 
Programming Guide: 
https://developer.apple.com/library/ios/documentation/DataManagement/Conceptual/IncrementalStorePG/Introduction/ 
Introduction.html 
Class reference: 
https://developer.apple.com/library/ios/documentation/CoreData/Reference/NSIncrementalStore_Class/Reference/ 
NSIncrementalStore.html 
Пара статей по NSIncrementalStore: 
http://nshipster.com/nsincrementalstore/ 
http://sealedabstract.com/code/nsincrementalstore-the-future-of-web-services-in-ios-mac-os-x/ 
Статья о реализации загрузки данных с сервера в CoreData: 
http://chris.eidhof.nl/post/17826914256/accessing-an-api-using-coredatas-nsincrementalstore 
Живой проект AFNetworking + NSIncrementalStore: 
https://github.com/AFNetworking/AFIncrementalStore 
Приложение Looky: 
https://itunes.apple.com/ru/app/id579331601 
agusev@neosphere.com

More Related Content

What's hot

Web Internship - PHP and MySQL
Web Internship - PHP and MySQLWeb Internship - PHP and MySQL
Web Internship - PHP and MySQLNoveo
 
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
 
Использование json/xml в БД PostgreSQL и Oracle для хранения произвольных ат...
 Использование json/xml в БД PostgreSQL и Oracle для хранения произвольных ат... Использование json/xml в БД PostgreSQL и Oracle для хранения произвольных ат...
Использование json/xml в БД PostgreSQL и Oracle для хранения произвольных ат...it-people
 
Mongo db aggregation
Mongo db aggregationMongo db aggregation
Mongo db aggregationAcceptic
 
Работа с геоданными в MongoDb
Работа с геоданными в MongoDbРабота с геоданными в MongoDb
Работа с геоданными в MongoDbOSLL
 
12 - Web-технологии. Django модели
12 - Web-технологии. Django модели12 - Web-технологии. Django модели
12 - Web-технологии. Django моделиRoman Brovko
 
Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...
Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...
Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...Ontico
 
Школа-студия разработки для iOS. Лекция 4. Работа с данными
Школа-студия разработки для iOS. Лекция 4. Работа с даннымиШкола-студия разработки для iOS. Лекция 4. Работа с данными
Школа-студия разработки для iOS. Лекция 4. Работа с даннымиГлеб Тарасов
 
Использование Tarantool для хранения чатов и лент друзей (Константин Осипов)
Использование Tarantool для хранения чатов и лент друзей (Константин Осипов)Использование Tarantool для хранения чатов и лент друзей (Константин Осипов)
Использование Tarantool для хранения чатов и лент друзей (Константин Осипов)Ontico
 
Active Record for CoreData
Active Record for CoreDataActive Record for CoreData
Active Record for CoreDataDmitriy Kuragin
 
Ice Php Framework Preview Release
Ice Php Framework Preview ReleaseIce Php Framework Preview Release
Ice Php Framework Preview ReleaseDenis Shestakov
 
Python dict: прошлое, настоящее, будущее
Python dict: прошлое, настоящее, будущееPython dict: прошлое, настоящее, будущее
Python dict: прошлое, настоящее, будущееdelimitry
 
PostgreSQL: практические примеры оптимизации SQL-запросов / Иван Фролков (Po...
PostgreSQL: практические примеры оптимизации SQL-запросов /  Иван Фролков (Po...PostgreSQL: практические примеры оптимизации SQL-запросов /  Иван Фролков (Po...
PostgreSQL: практические примеры оптимизации SQL-запросов / Иван Фролков (Po...Ontico
 
Дмитрий Новиков - Tarantool в Badoo
Дмитрий Новиков - Tarantool в BadooДмитрий Новиков - Tarantool в Badoo
Дмитрий Новиков - Tarantool в BadooMail.ru Group
 
Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?
Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?
Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?tfmailru
 
FrontTalks: Михаил Давыдов (Яндекс), «Promise – это не больно»
FrontTalks: Михаил Давыдов (Яндекс), «Promise – это не больно»FrontTalks: Михаил Давыдов (Яндекс), «Promise – это не больно»
FrontTalks: Михаил Давыдов (Яндекс), «Promise – это не больно»Yandex
 
О кэшировании (Андрей Шетухин)
О кэшировании (Андрей Шетухин)О кэшировании (Андрей Шетухин)
О кэшировании (Андрей Шетухин)Ontico
 
Магия метаклассов
Магия метаклассовМагия метаклассов
Магия метаклассовAndrey Zakharevich
 
12 вариантов использования Redis — в Tarantool (Александр Календарев, Констан...
12 вариантов использования Redis — в Tarantool (Александр Календарев, Констан...12 вариантов использования Redis — в Tarantool (Александр Календарев, Констан...
12 вариантов использования Redis — в Tarantool (Александр Календарев, Констан...Ontico
 

What's hot (20)

Web Internship - PHP and MySQL
Web Internship - PHP and MySQLWeb Internship - PHP and MySQL
Web Internship - PHP and MySQL
 
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
 
Использование json/xml в БД PostgreSQL и Oracle для хранения произвольных ат...
 Использование json/xml в БД PostgreSQL и Oracle для хранения произвольных ат... Использование json/xml в БД PostgreSQL и Oracle для хранения произвольных ат...
Использование json/xml в БД PostgreSQL и Oracle для хранения произвольных ат...
 
Mongo db aggregation
Mongo db aggregationMongo db aggregation
Mongo db aggregation
 
Decorators' recipes
Decorators' recipesDecorators' recipes
Decorators' recipes
 
Работа с геоданными в MongoDb
Работа с геоданными в MongoDbРабота с геоданными в MongoDb
Работа с геоданными в MongoDb
 
12 - Web-технологии. Django модели
12 - Web-технологии. Django модели12 - Web-технологии. Django модели
12 - Web-технологии. Django модели
 
Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...
Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...
Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...
 
Школа-студия разработки для iOS. Лекция 4. Работа с данными
Школа-студия разработки для iOS. Лекция 4. Работа с даннымиШкола-студия разработки для iOS. Лекция 4. Работа с данными
Школа-студия разработки для iOS. Лекция 4. Работа с данными
 
Использование Tarantool для хранения чатов и лент друзей (Константин Осипов)
Использование Tarantool для хранения чатов и лент друзей (Константин Осипов)Использование Tarantool для хранения чатов и лент друзей (Константин Осипов)
Использование Tarantool для хранения чатов и лент друзей (Константин Осипов)
 
Active Record for CoreData
Active Record for CoreDataActive Record for CoreData
Active Record for CoreData
 
Ice Php Framework Preview Release
Ice Php Framework Preview ReleaseIce Php Framework Preview Release
Ice Php Framework Preview Release
 
Python dict: прошлое, настоящее, будущее
Python dict: прошлое, настоящее, будущееPython dict: прошлое, настоящее, будущее
Python dict: прошлое, настоящее, будущее
 
PostgreSQL: практические примеры оптимизации SQL-запросов / Иван Фролков (Po...
PostgreSQL: практические примеры оптимизации SQL-запросов /  Иван Фролков (Po...PostgreSQL: практические примеры оптимизации SQL-запросов /  Иван Фролков (Po...
PostgreSQL: практические примеры оптимизации SQL-запросов / Иван Фролков (Po...
 
Дмитрий Новиков - Tarantool в Badoo
Дмитрий Новиков - Tarantool в BadooДмитрий Новиков - Tarantool в Badoo
Дмитрий Новиков - Tarantool в Badoo
 
Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?
Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?
Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?
 
FrontTalks: Михаил Давыдов (Яндекс), «Promise – это не больно»
FrontTalks: Михаил Давыдов (Яндекс), «Promise – это не больно»FrontTalks: Михаил Давыдов (Яндекс), «Promise – это не больно»
FrontTalks: Михаил Давыдов (Яндекс), «Promise – это не больно»
 
О кэшировании (Андрей Шетухин)
О кэшировании (Андрей Шетухин)О кэшировании (Андрей Шетухин)
О кэшировании (Андрей Шетухин)
 
Магия метаклассов
Магия метаклассовМагия метаклассов
Магия метаклассов
 
12 вариантов использования Redis — в Tarantool (Александр Календарев, Констан...
12 вариантов использования Redis — в Tarantool (Александр Календарев, Констан...12 вариантов использования Redis — в Tarantool (Александр Календарев, Констан...
12 вариантов использования Redis — в Tarantool (Александр Календарев, Констан...
 

Similar to Встреча №8. NSIncrementalStore, или как заставить Core Data варить ваш собственный кофе, Андрей Гусев

Курсы по мобильной разработке под iOS. 5 лекция. Работа с данными
Курсы по мобильной разработке под iOS. 5 лекция. Работа с даннымиКурсы по мобильной разработке под iOS. 5 лекция. Работа с данными
Курсы по мобильной разработке под iOS. 5 лекция. Работа с даннымиГлеб Тарасов
 
хранение данных
хранение данныххранение данных
хранение данныхNoveo
 
RxJava + Retrofit
RxJava + RetrofitRxJava + Retrofit
RxJava + RetrofitDev2Dev
 
Влад Ковташ — Yap Database
Влад Ковташ — Yap DatabaseВлад Ковташ — Yap Database
Влад Ковташ — Yap DatabaseCocoaHeads
 
Rambler.iOS #7: Построение сложного табличного интерфейса
Rambler.iOS #7: Построение сложного табличного интерфейсаRambler.iOS #7: Построение сложного табличного интерфейса
Rambler.iOS #7: Построение сложного табличного интерфейсаRAMBLER&Co
 
Интуит. Разработка приложений для iOS. Лекция 9. Нестандартный интерфейс
Интуит. Разработка приложений для iOS. Лекция 9. Нестандартный интерфейсИнтуит. Разработка приложений для iOS. Лекция 9. Нестандартный интерфейс
Интуит. Разработка приложений для iOS. Лекция 9. Нестандартный интерфейсГлеб Тарасов
 
Hacking PostgreSQL. Обзор исходного кода
Hacking PostgreSQL. Обзор исходного кодаHacking PostgreSQL. Обзор исходного кода
Hacking PostgreSQL. Обзор исходного кодаAnastasia Lubennikova
 
Web осень 2012 лекция 4
Web осень 2012 лекция 4Web осень 2012 лекция 4
Web осень 2012 лекция 4Technopark
 
C++ и базы данных
C++ и базы данныхC++ и базы данных
C++ и базы данныхmcroitor
 
Организация работы с API на Vue.js, Виталий Копачёв
Организация работы с API на Vue.js, Виталий КопачёвОрганизация работы с API на Vue.js, Виталий Копачёв
Организация работы с API на Vue.js, Виталий КопачёвMail.ru Group
 
Школа-студия разработки приложений для iOS. Лекция 1. Objective-C
Школа-студия разработки приложений для iOS. Лекция 1. Objective-CШкола-студия разработки приложений для iOS. Лекция 1. Objective-C
Школа-студия разработки приложений для iOS. Лекция 1. Objective-CГлеб Тарасов
 
Kvc, kvo
Kvc, kvoKvc, kvo
Kvc, kvoNoveo
 
09 ns data
09   ns data09   ns data
09 ns dataNoveo
 
Владимир Горбенко «Использование блоков в Objective-C»
Владимир Горбенко «Использование блоков в Objective-C»Владимир Горбенко «Использование блоков в Objective-C»
Владимир Горбенко «Использование блоков в Objective-C»e-Legion
 
02 ns string
02   ns string02   ns string
02 ns stringNoveo
 
Web весна 2013 лекция 4
Web весна 2013 лекция 4Web весна 2013 лекция 4
Web весна 2013 лекция 4Technopark
 

Similar to Встреча №8. NSIncrementalStore, или как заставить Core Data варить ваш собственный кофе, Андрей Гусев (20)

Курсы по мобильной разработке под iOS. 5 лекция. Работа с данными
Курсы по мобильной разработке под iOS. 5 лекция. Работа с даннымиКурсы по мобильной разработке под iOS. 5 лекция. Работа с данными
Курсы по мобильной разработке под iOS. 5 лекция. Работа с данными
 
хранение данных
хранение данныххранение данных
хранение данных
 
RxJava + Retrofit
RxJava + RetrofitRxJava + Retrofit
RxJava + Retrofit
 
Влад Ковташ — Yap Database
Влад Ковташ — Yap DatabaseВлад Ковташ — Yap Database
Влад Ковташ — Yap Database
 
Rambler.iOS #7: Построение сложного табличного интерфейса
Rambler.iOS #7: Построение сложного табличного интерфейсаRambler.iOS #7: Построение сложного табличного интерфейса
Rambler.iOS #7: Построение сложного табличного интерфейса
 
Talks on collections
Talks on collectionsTalks on collections
Talks on collections
 
Интуит. Разработка приложений для iOS. Лекция 9. Нестандартный интерфейс
Интуит. Разработка приложений для iOS. Лекция 9. Нестандартный интерфейсИнтуит. Разработка приложений для iOS. Лекция 9. Нестандартный интерфейс
Интуит. Разработка приложений для iOS. Лекция 9. Нестандартный интерфейс
 
Hacking PostgreSQL. Обзор исходного кода
Hacking PostgreSQL. Обзор исходного кодаHacking PostgreSQL. Обзор исходного кода
Hacking PostgreSQL. Обзор исходного кода
 
Web осень 2012 лекция 4
Web осень 2012 лекция 4Web осень 2012 лекция 4
Web осень 2012 лекция 4
 
C++ и базы данных
C++ и базы данныхC++ и базы данных
C++ и базы данных
 
Организация работы с API на Vue.js, Виталий Копачёв
Организация работы с API на Vue.js, Виталий КопачёвОрганизация работы с API на Vue.js, Виталий Копачёв
Организация работы с API на Vue.js, Виталий Копачёв
 
Swift School #3
Swift School #3Swift School #3
Swift School #3
 
msumobi2. Лекция 2
msumobi2. Лекция 2msumobi2. Лекция 2
msumobi2. Лекция 2
 
Школа-студия разработки приложений для iOS. Лекция 1. Objective-C
Школа-студия разработки приложений для iOS. Лекция 1. Objective-CШкола-студия разработки приложений для iOS. Лекция 1. Objective-C
Школа-студия разработки приложений для iOS. Лекция 1. Objective-C
 
Kvc, kvo
Kvc, kvoKvc, kvo
Kvc, kvo
 
09 ns data
09   ns data09   ns data
09 ns data
 
Владимир Горбенко «Использование блоков в Objective-C»
Владимир Горбенко «Использование блоков в Objective-C»Владимир Горбенко «Использование блоков в Objective-C»
Владимир Горбенко «Использование блоков в Objective-C»
 
JQuery
JQueryJQuery
JQuery
 
02 ns string
02   ns string02   ns string
02 ns string
 
Web весна 2013 лекция 4
Web весна 2013 лекция 4Web весна 2013 лекция 4
Web весна 2013 лекция 4
 

More from CocoaHeads

Дизайнер, разработчик, нет конфликта, нет драмы — Евгения Малкова
Дизайнер, разработчик, нет конфликта, нет драмы — Евгения МалковаДизайнер, разработчик, нет конфликта, нет драмы — Евгения Малкова
Дизайнер, разработчик, нет конфликта, нет драмы — Евгения МалковаCocoaHeads
 
Эффективность на рубеже UITableView — Александр Зимин
Эффективность на рубеже UITableView — Александр ЗиминЭффективность на рубеже UITableView — Александр Зимин
Эффективность на рубеже UITableView — Александр ЗиминCocoaHeads
 
Александр Зимин — Анимация в iOS
Александр Зимин — Анимация в iOSАлександр Зимин — Анимация в iOS
Александр Зимин — Анимация в iOSCocoaHeads
 
UICollectionView — Александр Зимин
UICollectionView — Александр ЗиминUICollectionView — Александр Зимин
UICollectionView — Александр ЗиминCocoaHeads
 
Push Notifications
Push NotificationsPush Notifications
Push NotificationsCocoaHeads
 
Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...
Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...
Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...CocoaHeads
 
Встреча №9. Будущее паттерна MVVM в iOS приложениях, Денис Лебедев
Встреча №9. Будущее паттерна MVVM в iOS приложениях, Денис ЛебедевВстреча №9. Будущее паттерна MVVM в iOS приложениях, Денис Лебедев
Встреча №9. Будущее паттерна MVVM в iOS приложениях, Денис ЛебедевCocoaHeads
 
Встреча №9. AudioBus: Эволюция звука, Данил Пархоменко
Встреча №9. AudioBus: Эволюция звука, Данил ПархоменкоВстреча №9. AudioBus: Эволюция звука, Данил Пархоменко
Встреча №9. AudioBus: Эволюция звука, Данил ПархоменкоCocoaHeads
 
Встреча №8. RESTful клиент — это просто. Тонкости использования RestKit, Миха...
Встреча №8. RESTful клиент — это просто. Тонкости использования RestKit, Миха...Встреча №8. RESTful клиент — это просто. Тонкости использования RestKit, Миха...
Встреча №8. RESTful клиент — это просто. Тонкости использования RestKit, Миха...CocoaHeads
 
Встреча №8. Использование возможностей iOS 7 SDK, Ксения Покровская
Встреча №8. Использование возможностей iOS 7 SDK, Ксения ПокровскаяВстреча №8. Использование возможностей iOS 7 SDK, Ксения Покровская
Встреча №8. Использование возможностей iOS 7 SDK, Ксения ПокровскаяCocoaHeads
 
Встреча №5. Взаимодействие между дизайнерами и разработчиками, Евгений Беляев
Встреча №5. Взаимодействие между дизайнерами и разработчиками, Евгений БеляевВстреча №5. Взаимодействие между дизайнерами и разработчиками, Евгений Беляев
Встреча №5. Взаимодействие между дизайнерами и разработчиками, Евгений БеляевCocoaHeads
 
Встреча №5. Можно ли сделать дизайн без дизайнера? Александр Киров
Встреча №5. Можно ли сделать дизайн без дизайнера? Александр КировВстреча №5. Можно ли сделать дизайн без дизайнера? Александр Киров
Встреча №5. Можно ли сделать дизайн без дизайнера? Александр КировCocoaHeads
 
Встреча №5. Звук и ресурсы iOS в realtime, Константин Платов
Встреча №5. Звук и ресурсы iOS в realtime, Константин ПлатовВстреча №5. Звук и ресурсы iOS в realtime, Константин Платов
Встреча №5. Звук и ресурсы iOS в realtime, Константин ПлатовCocoaHeads
 

More from CocoaHeads (13)

Дизайнер, разработчик, нет конфликта, нет драмы — Евгения Малкова
Дизайнер, разработчик, нет конфликта, нет драмы — Евгения МалковаДизайнер, разработчик, нет конфликта, нет драмы — Евгения Малкова
Дизайнер, разработчик, нет конфликта, нет драмы — Евгения Малкова
 
Эффективность на рубеже UITableView — Александр Зимин
Эффективность на рубеже UITableView — Александр ЗиминЭффективность на рубеже UITableView — Александр Зимин
Эффективность на рубеже UITableView — Александр Зимин
 
Александр Зимин — Анимация в iOS
Александр Зимин — Анимация в iOSАлександр Зимин — Анимация в iOS
Александр Зимин — Анимация в iOS
 
UICollectionView — Александр Зимин
UICollectionView — Александр ЗиминUICollectionView — Александр Зимин
UICollectionView — Александр Зимин
 
Push Notifications
Push NotificationsPush Notifications
Push Notifications
 
Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...
Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...
Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...
 
Встреча №9. Будущее паттерна MVVM в iOS приложениях, Денис Лебедев
Встреча №9. Будущее паттерна MVVM в iOS приложениях, Денис ЛебедевВстреча №9. Будущее паттерна MVVM в iOS приложениях, Денис Лебедев
Встреча №9. Будущее паттерна MVVM в iOS приложениях, Денис Лебедев
 
Встреча №9. AudioBus: Эволюция звука, Данил Пархоменко
Встреча №9. AudioBus: Эволюция звука, Данил ПархоменкоВстреча №9. AudioBus: Эволюция звука, Данил Пархоменко
Встреча №9. AudioBus: Эволюция звука, Данил Пархоменко
 
Встреча №8. RESTful клиент — это просто. Тонкости использования RestKit, Миха...
Встреча №8. RESTful клиент — это просто. Тонкости использования RestKit, Миха...Встреча №8. RESTful клиент — это просто. Тонкости использования RestKit, Миха...
Встреча №8. RESTful клиент — это просто. Тонкости использования RestKit, Миха...
 
Встреча №8. Использование возможностей iOS 7 SDK, Ксения Покровская
Встреча №8. Использование возможностей iOS 7 SDK, Ксения ПокровскаяВстреча №8. Использование возможностей iOS 7 SDK, Ксения Покровская
Встреча №8. Использование возможностей iOS 7 SDK, Ксения Покровская
 
Встреча №5. Взаимодействие между дизайнерами и разработчиками, Евгений Беляев
Встреча №5. Взаимодействие между дизайнерами и разработчиками, Евгений БеляевВстреча №5. Взаимодействие между дизайнерами и разработчиками, Евгений Беляев
Встреча №5. Взаимодействие между дизайнерами и разработчиками, Евгений Беляев
 
Встреча №5. Можно ли сделать дизайн без дизайнера? Александр Киров
Встреча №5. Можно ли сделать дизайн без дизайнера? Александр КировВстреча №5. Можно ли сделать дизайн без дизайнера? Александр Киров
Встреча №5. Можно ли сделать дизайн без дизайнера? Александр Киров
 
Встреча №5. Звук и ресурсы iOS в realtime, Константин Платов
Встреча №5. Звук и ресурсы iOS в realtime, Константин ПлатовВстреча №5. Звук и ресурсы iOS в realtime, Константин Платов
Встреча №5. Звук и ресурсы iOS в realtime, Константин Платов
 

Встреча №8. NSIncrementalStore, или как заставить Core Data варить ваш собственный кофе, Андрей Гусев

  • 1. NSIncrementalStore или как заставить CoreData варить ваш собственный кофе Андрей Гусев Ведущий разработчик iOS NeoSphere LLC
  • 2.
  • 3. Получение данных с использованием CoreData 10 Время Загрузка Обработка и сохранение 8
  • 5.
  • 6. Как пользоваться Инициализация Модель базы данных Переопределение обязательных методов
  • 7. + (void)initialize { [NSPersistentStoreCoordinator registerStoreClass:self forStoreType:[self persistentStoreType]]; } + (NSString *)persistentStoreType { return NSStringFromClass(self); } Инициализация [_pStoreCoordinator addPersistentStoreWithType:[MyIncrementalStore persistentStoreType] configuration:@"IncrementalStore" URL:incrementalStoreUrl options:nil error:&error]
  • 8.
  • 9. Методы для переопределения - (BOOL)loadMetadata:(NSError **)error - (id)executeRequest:(NSPersistentStoreRequest *)request withContext:(NSManagedObjectContext *)context error:(NSError **)error - (NSIncrementalStoreNode *)newValuesForObjectWithID:(NSManagedObjectID *)objectID withContext:(NSManagedObjectContext *)context error:(NSError **)error; - (id)newValueForRelationship:(NSRelationshipDescription *)relationship forObjectWithID:(NSManagedObjectID *)objectID withContext:(NSManagedObjectContext *)context error:(NSError **)error; - (NSArray *)obtainPermanentIDsForObjects:(NSArray *)array error:(NSError **)error;
  • 10. - (BOOL)loadMetadata:(NSError **)error { NSMutableDictionary *mutableMetadata = [NSMutableDictionary dictionary]; [mutableMetadata setValue:[[NSProcessInfo processInfo] globallyUniqueString] forKey:NSStoreUUIDKey]; [mutableMetadata setValue:[[self class] persistentStoreType] forKey:NSStoreTypeKey]; [self setMetadata:mutableMetadata]; return YES; }
  • 11. - (id)executeRequest:(NSPersistentStoreRequest *)request withContext:(NSManagedObjectContext *)context error:(NSError **)error if (request.requestType == NSFetchRequestType) { NSFetchRequest *fRequest = (NSFetchRequest *)request; switch (fRequest.resultType) { case NSManagedObjectResultType: case NSManagedObjectIDResultType: { /* Выборка идентификаторов объектов */ if (fRequest.resultType == NSManagedObjectResultType) { //результат - массив NSManagedObject-ов (Faults) } else { //результат - массив NSManagedObjectID } } break; ***
  • 12. - (id)executeRequest:(NSPersistentStoreRequest *)request withContext:(NSManagedObjectContext *)context error:(NSError **)error //Получение CoreData ObjectID для объекта NSManagedObjectID *oid = [self newObjectIDForEntity:entity referenceObject:item]; //Получение fault-а объекта по его CoreData ObjectID [context objectWithID:oid]; //Получение исходного referenceObject по CoreData objectID id item = [self referenceObjectForObjectID:oid]; item -> NSString или NSNumber
  • 13. - (id)executeRequest:(NSPersistentStoreRequest *)request withContext:(NSManagedObjectContext *)context error:(NSError **)error ReferenceObject (item) NSManagedObjectID NSManagedObject
  • 14. - (id)executeRequest:(NSPersistentStoreRequest *)request withContext:(NSManagedObjectContext *)context error:(NSError **)error if (request.requestType == NSFetchRequestType) { NSFetchRequest *fRequest = (NSFetchRequest *)request; switch (fRequest.resultType) { *** case NSDictionaryResultType: { /* Выборка значений конкретных полей */ //Результат - массив NSDictionary. //Ключи - название полей данных, значения - сами данные } break; case NSCountResultType: { /* Подсчёт количества объектов */ //Результат - массив, состоящий из одного NSNumber-а } break;
  • 15. - (id)executeRequest:(NSPersistentStoreRequest *)request withContext:(NSManagedObjectContext *)context error:(NSError **)error *** else if (request.requestType == NSSaveRequestType) { /* Обработка NSSaveChangesRequest: - (NSSet *)deletedObjects - (NSSet *)insertedObjects - (NSSet *)updatedObjects - (NSSet *) lockedObjects */ //результат - пустой массив. }
  • 16. - (NSIncrementalStoreNode *)newValuesForObjectWithID:(NSManagedObjectID *)objectID withContext:(NSManagedObjectContext *)context error:(NSError **)error; /* Выбрать все данные для объекта с заданным ObjectID */ /* Заполнить NSDictionary полученными значениями: Ключ - название поля объекта в DataModel Значение - конкретное значение для объекта */ return [[NSIncrementalStoreNode alloc] initWithObjectID:objectID withValues:objectDataDict version:version];
  • 17. - (id)newValueForRelationship:(NSRelationshipDescription *)relationship forObjectWithID:(NSManagedObjectID *)objectID withContext:(NSManagedObjectContext *)context error:(NSError **)error; if (relationship.isToMany) { return [NSManagedObject, NSManagedObject, ...] или [] } else { return NSManagedObject или [NSNull null] }
  • 18. - (NSArray *)obtainPermanentIDsForObjects:(NSArray *)array error:(NSError **)error;
  • 20. Полезные ссылки Демонстрационное приложение: https://github.com/GusevAndrey/NSIncrementalStoreInUse Programming Guide: https://developer.apple.com/library/ios/documentation/DataManagement/Conceptual/IncrementalStorePG/Introduction/ Introduction.html Class reference: https://developer.apple.com/library/ios/documentation/CoreData/Reference/NSIncrementalStore_Class/Reference/ NSIncrementalStore.html Пара статей по NSIncrementalStore: http://nshipster.com/nsincrementalstore/ http://sealedabstract.com/code/nsincrementalstore-the-future-of-web-services-in-ios-mac-os-x/ Статья о реализации загрузки данных с сервера в CoreData: http://chris.eidhof.nl/post/17826914256/accessing-an-api-using-coredatas-nsincrementalstore Живой проект AFNetworking + NSIncrementalStore: https://github.com/AFNetworking/AFIncrementalStore Приложение Looky: https://itunes.apple.com/ru/app/id579331601 agusev@neosphere.com