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 вашего постоянного хранилища, потому что ваше добавочное хранилище не имеет того же идентификатора.

Другие вопросы по тегам