0

根据 Apple,我在 App Delegate 中创建我的核心数据堆栈,然后将 managedObjectContext 传递给我的第一个控制器,然后从那里传递到第二个控制器,依此类推。

我正在尝试在后台线程中做一些工作并想使用 PrivateConcurrency 类型,但我收到错误消息,即父级必须是 Main 或 Private。

在应用程序委托中,我创建了上下文

- (NSManagedObjectContext *)managedObjectContext
{
    if (_managedObjectContext != nil) {
        return _managedObjectContext;
    }

    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
    if (coordinator != nil) {
        _managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
        [_managedObjectContext setPersistentStoreCoordinator:coordinator];
    }
    return _managedObjectContext;
}

然后我将它传递给我的第一个控制器

UINavigationController *navigationController = (UINavigationController *)self.window.rootViewController;
Paperwoven_LoadingViewController *firstController = (Paperwoven_LoadingViewController *)navigationController.topViewController;
[firstController setManagedObjectContext:[self managedObjectContext]];
NSLog(@"concurrency type is %@", [self managedObjectContext]);
NSLog(@"concurrency type is %u",firstController.managedObjectContext.concurrencyType);

我可以看到,当我从 self 注销并发类型时,我得到 2,即 Main。但是当我检查我刚刚发送到第一个控制器的上下文时,我得到 0。为什么它没有正确传递?

编辑

此外,我可以通过获取 managedObjectContextAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]并且我可以看到并发类型是 MAIN 但如果在下一行我self.managedObjectContext = appDelegate.managedObjectContext检查了 self.managedObjectContext 上的并发类型,它是 0。看起来将它从 App 委托分配给控制器会丢失并发类型.

4

2 回答 2

1

从您的代码中,最可能的解释firstController是 nil。你用这条线得到它:

Paperwoven_LoadingViewController *firstController = (Paperwoven_LoadingViewController *)navigationController.topViewController;

但如果topViewController是 nil,那么firstViewController就是 nil。在以下几行中:

[firstController setManagedObjectContext:[self managedObjectContext]];
NSLog(@"concurrency type is %@", [self managedObjectContext]);
NSLog(@"concurrency type is %u",firstController.managedObjectContext.concurrencyType);

在 Objective-C 中向 nil 发送消息不是错误,因此第一行是空操作。在上面的最后一行中,您正在打印nil.managedObjectContext.concurrencyType,它将是 0。

这看起来不像是核心数据问题——更像是配置视图控制器的问题。

于 2013-03-01T01:24:07.643 回答
0

我是个白痴,有点。另一位开发人员将所有控制器都具有的相同核心数据堆栈方法放在 Base 控制器中。发生的事情是我能够设置控制器上下文,但随后基本控制器将创建自己的上下文并覆盖传入的上下文。删除此垃圾代码解决了我的问题。这回答了我的问题,所以我将关闭它。请不要投反对票,我们都有过编码脑放屁。

于 2013-03-01T20:13:14.160 回答