NSIncrementalStore: постоянное хранилище объекта недоступно из этого координатора NSManagedObjectContext
Я пытаюсь реализовать NSIncrementalStore, который будет обращаться к серверу через API RPC. Он должен кэшировать все данные локально, и поэтому я начал с создания NSIncrementalStore для использования другого основного стека данных, который используется в качестве кэша.
Итак, сначала я настроил метаданные и настроил стек основных данных, который будет использовать кеш. Файл кэша 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];
Я не могу понять, почему это так - именно так Apple предлагает сделать это в документации!
Эта ошибка, похоже, связана с доступом к контексту между потоками, но я этого не делаю. Любые предложения относительно того, что здесь не так?
1 ответ
Вы используете неправильный objectID.
ObjectID из вашего кэша не будет соответствовать objectID вашего постоянного хранилища, потому что ваше добавочное хранилище не имеет того же идентификатора.