2014-01-14 2 views
0

Я пытаюсь реализовать NSIncrementalStore, который будет обращаться к серверу через API RPC. Он должен кэшировать все данные локально, и поэтому я начал с создания NSIncrementalStore, чтобы использовать другой основной стек данных, который используется в качестве кеша.NSIncrementalStore: Постоянный магазин объекта недоступен из этого координатора NSManagedObjectContext

Итак, сначала я установил метаданные и установил основной стек данных, который будет использовать кеш. Файл кэша SQL является URL передается в магазин, когда инициализируются:

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

NSMutableDictionary *mutableMetadata = [NSMutableDictionary dictionary]; 
[mutableMetadata setValue:[[NSProcessInfo processInfo] globallyUniqueString] forKey:NSStoreUUIDKey]; 
[mutableMetadata setValue:RTkCachedAPIStoreType forKey:NSStoreTypeKey]; 
//[mutableMetadata setValue:NSStringFromClass([self class]) forKey:NSStoreTypeKey]; 
[self setMetadata:mutableMetadata]; 

// Set up the Cache Stack 
NSManagedObjectModel *model = [self.persistentStoreCoordinator.managedObjectModel copy]; 
self.cacheModel = model; 

self.cachePersistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:self.cacheModel]; 

self.cacheContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; 

NSURL *storeURL; 
if ([self.URL isFileURL]) { 
    storeURL = self.URL; 
} 

NSError *storeAddError = nil; 
if (![self.cachePersistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType 
                 configuration:nil 
                    URL:storeURL 
                   options:nil 
                   error:&storeAddError]) { 
    NSLog(@"Fatal error while creating persistent store: %@", storeAddError); 
    abort(); 
} 

[self.cacheContext setPersistentStoreCoordinator:self.cachePersistentStoreCoordinator]; 

return YES; 
} 

выполнить запрос для простого запроса на лицо выглядеть следующий код. По сути, я просто беру запрос, завершая его как FetchRequest и выполняя запрос в стек данных Cache Core. Затем я создаю объекты, используя возвращенные ObjectId на контекст вызова:

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

if ([request requestType] == NSFetchRequestType) { 
    NSFetchRequest *fetchRequest = (NSFetchRequest *)request; 
    NSEntityDescription *entity = [fetchRequest entity]; 

    NSFetchRequest *cacheFetchRequest = [[NSFetchRequest alloc] init]; 
    cacheFetchRequest.entity = entity; 
    __block NSArray *fetchedObjectFromCache; 
    [self.cacheContext performBlockAndWait:^(){ 
     fetchedObjectFromCache = [self.cacheContext executeFetchRequest:cacheFetchRequest error:error]; 
    }]; 
    NSMutableArray *fetchedObjects = [NSMutableArray arrayWithCapacity:[fetchedObjectFromCache count]]; 
    for (NSManagedObject *anObject in fetchedObjectFromCache) { 
     NSManagedObjectID *objectID = anObject.objectID; 
     NSManagedObject *managedObject = [context objectWithID:objectID]; 
     [fetchedObjects addObject:managedObject]; 
    } 
    return fetchedObjects; 
} 
} 

Когда я попробовать это он бросает исключение с ошибкой

<unknown>:0: error: -[] : Object's persistent store is not reachable from this NSManagedObjectContext's coordinator

на линии NSManagedObject *managedObject = [context objectWithID:objectID]; я не могу почему это так - это то, как явствует, что это делается в документах!

Эта ошибка, кажется, связана с доступом к контексту через потоки, но я этого не делаю. Любые предложения относительно того, что здесь не так?

ответ

3

Вы используете неправильный идентификатор объекта.

Объект ID из вашего кеша не будет соответствовать идентификатору объекта вашего постоянного хранилища, потому что у вашего инкрементного хранилища нет одинакового идентификатора.

+0

Спасибо! В этом была проблема, глядя мне прямо в глаза! – SimonB

+0

:) добро пожаловать! – ImHuntingWabbits

Смежные вопросы