Встреча №8. nsincrementalstore, или как заставить core data варить...

20
NSIncrementalStore или как заставить CoreData варить ваш собственный кофе Андрей Гусев Ведущий разработчик iOS NeoSphere LLC

Upload: cocoaheads-moscow

Post on 13-Jul-2015

163 views

Category:

Software


3 download

TRANSCRIPT

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

NSIncrementalStoreили как заставить CoreData варить ваш

собственный кофе

Андрей Гусев Ведущий разработчик iOS

NeoSphere LLC

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

Врем

я

Загрузка Обработка и сохранение

10

8

Получение данных с использованием CoreData

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

CoreData + NSIncrementalStore =

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

Как пользоваться

Инициализация

Модель базы данных

Переопределение обязательных методов

Page 7: Встреча №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]

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

Методы для переопределения

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

- (BOOL)loadMetadata:(NSError **)error

- (NSArray *)obtainPermanentIDsForObjects:(NSArray *)array error:(NSError **)error;

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

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

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

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

***

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

- (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

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

- (id)executeRequest:(NSPersistentStoreRequest *)request withContext:(NSManagedObjectContext *)context error:(NSError **)error

NSManagedObjectID

NSManagedObject

ReferenceObject (item)

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

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

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

- (id)executeRequest:(NSPersistentStoreRequest *)request withContext:(NSManagedObjectContext *)context error:(NSError **)error

***

else if (request.requestType == NSSaveRequestType) { /*

Обработка NSSaveChangesRequest: - (NSSet *)deletedObjects

- (NSSet *)insertedObjects

- (NSSet *)updatedObjects

- (NSSet *) lockedObjects */

//результат - пустой массив. }

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

- (NSIncrementalStoreNode *)newValuesForObjectWithID:(NSManagedObjectID *)objectID withContext:(NSManagedObjectContext *)context error:(NSError **)error;

/* Выбрать все данные для объекта с заданным ObjectID */

/* Заполнить NSDictionary полученными значениями:

Ключ - название поля объекта в DataModel Значение - конкретное значение для объекта

*/

return [[NSIncrementalStoreNode alloc] initWithObjectID:objectID withValues:objectDataDict version:version];

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

- (id)newValueForRelationship:(NSRelationshipDescription *)relationship forObjectWithID:(NSManagedObjectID *)objectID withContext:(NSManagedObjectContext *)context error:(NSError **)error;

if (relationship.isToMany) {

return [NSManagedObject, NSManagedObject, ...] или [] } else {

return NSManagedObject или [NSNull null] }

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

- (NSArray *)obtainPermanentIDsForObjects:(NSArray *)array error:(NSError **)error;

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

Вопросы?!

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

Полезные ссылки

[email protected]

Демонстрационное приложение: 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