Установить постоянное хранилище и родительский контекст

Что происходит, когда NSManagedObjectContext установлено и постоянное хранилище, и родительский контекст и вызвано сохранение? Будет ли он выталкивать данные как в постоянное хранилище, так и в родительский контекст один за другим? Или это сделало бы это одновременно? Или базовые данные просто выдают жалобное исключение?

API напрямую не мешает одному установить двух "родителей" для данного контекста.

2 ответа

Решение

Это произойдет:

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Context already has a coordinator; cannot replace.'

Это происходит потому, что когда вы устанавливаете parentContext, persistentStoreCoordinator автоматически устанавливается на persistentStoreCoordinator родительского контекста.

Нам не нужно устанавливать координатор для управляемого контекста, если мы назначаем координатор для родительского контекста

NSManagedObjectContext *moc = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
    [self setManagedObjectContext:moc];

    [self setPrivateContext:[[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]];

    /// when you set parentContext, the persistentStoreCoordinator is automatically set to the persistentStoreCoordinator of the parent contex
    [self.privateContext setPersistentStoreCoordinator:coordinator];
    [self.managedObjectContext setParentContext:self.privateContext];

Вот полный код для использования в примере Framework -

    NSURL *modelURL = [[NSBundle bundleForClass:[self class]] URLForResource:@"TVModelSDK" withExtension:@"momd"];
    NSManagedObjectModel *mom = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
    NSAssert(mom, @"Failed to initialize mom from URL: %@", modelURL);

    NSPersistentStoreCoordinator *coordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:mom];

    NSManagedObjectContext *moc = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
    /// DONOT set coordinator for managed Context ! 
    // [moc setPersistentStoreCoordinator:coordinator];
    [self setManagedObjectContext:moc];

    [self setPrivateContext:[[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]];
    /// when you set parentContext, the persistentStoreCoordinator is automatically set to the persistentStoreCoordinator of the parent contex
    [self.privateContext setPersistentStoreCoordinator:coordinator];
    [self.managedObjectContext setParentContext:self.privateContext];
Другие вопросы по тегам