SlideShare a Scribd company logo
NSIncrementalStore 
или как заставить CoreData варить ваш 
собственный кофе 
Андрей Гусев 
Ведущий разработчик iOS 
NeoSphere LLC
Встреча №8. NSIncrementalStore, или как заставить Core Data варить ваш собственный кофе, Андрей Гусев
Получение данных с использованием CoreData 
10 
Время Загрузка Обработка и сохранение 
8
CoreData + NSIncrementalStore =
Встреча №8. NSIncrementalStore, или как заставить Core Data варить ваш собственный кофе, Андрей Гусев
Как пользоваться 
Инициализация 
Модель базы данных 
Переопределение обязательных методов
+ (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. NSIncrementalStore, или как заставить Core Data варить ваш собственный кофе, Андрей Гусев
Методы для переопределения 
- (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

PDF
Интуит. Разработка приложений для iOS. Лекция 8. Работа с данными
PDF
Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)
ODP
Работа с БД в Drupal 7
PPTX
Денормализованное хранение данных в PostgreSQL 9.2 (Александр Коротков)
PPTX
PHP and MySQL
PDF
Михаил Давыдов — JavaScript: Асинхронность
PDF
Konstantin Krivlenia - "Continuous integration for frontend"
PPTX
Caching on highload Drupal site - Alexander Shumenko
Интуит. Разработка приложений для iOS. Лекция 8. Работа с данными
Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)
Работа с БД в Drupal 7
Денормализованное хранение данных в PostgreSQL 9.2 (Александр Коротков)
PHP and MySQL
Михаил Давыдов — JavaScript: Асинхронность
Konstantin Krivlenia - "Continuous integration for frontend"
Caching on highload Drupal site - Alexander Shumenko

What's hot (20)

PDF
Web Internship - PHP and MySQL
PPTX
MongoDB - About Performance Optimization, Ivan Griga - Smart Gamma
PDF
Использование json/xml в БД PostgreSQL и Oracle для хранения произвольных ат...
PDF
Mongo db aggregation
PDF
Decorators' recipes
PDF
Работа с геоданными в MongoDb
PDF
12 - Web-технологии. Django модели
PDF
Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...
PDF
Школа-студия разработки для iOS. Лекция 4. Работа с данными
PDF
Использование Tarantool для хранения чатов и лент друзей (Константин Осипов)
PDF
Active Record for CoreData
ODP
Ice Php Framework Preview Release
PDF
Python dict: прошлое, настоящее, будущее
PDF
PostgreSQL: практические примеры оптимизации SQL-запросов / Иван Фролков (Po...
PDF
Дмитрий Новиков - Tarantool в Badoo
PDF
Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?
PDF
FrontTalks: Михаил Давыдов (Яндекс), «Promise – это не больно»
PPT
О кэшировании (Андрей Шетухин)
PDF
Магия метаклассов
PDF
12 вариантов использования Redis — в Tarantool (Александр Календарев, Констан...
Web Internship - PHP and MySQL
MongoDB - About Performance Optimization, Ivan Griga - Smart Gamma
Использование json/xml в БД PostgreSQL и Oracle для хранения произвольных ат...
Mongo db aggregation
Decorators' recipes
Работа с геоданными в MongoDb
12 - Web-технологии. Django модели
Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...
Школа-студия разработки для iOS. Лекция 4. Работа с данными
Использование Tarantool для хранения чатов и лент друзей (Константин Осипов)
Active Record for CoreData
Ice Php Framework Preview Release
Python dict: прошлое, настоящее, будущее
PostgreSQL: практические примеры оптимизации SQL-запросов / Иван Фролков (Po...
Дмитрий Новиков - Tarantool в Badoo
Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?
FrontTalks: Михаил Давыдов (Яндекс), «Promise – это не больно»
О кэшировании (Андрей Шетухин)
Магия метаклассов
12 вариантов использования Redis — в Tarantool (Александр Календарев, Констан...
Ad

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

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

More from CocoaHeads (13)

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

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

  • 1. NSIncrementalStore или как заставить CoreData варить ваш собственный кофе Андрей Гусев Ведущий разработчик iOS NeoSphere LLC
  • 3. Получение данных с использованием CoreData 10 Время Загрузка Обработка и сохранение 8
  • 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]
  • 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