核心数据并发类型未按预期工作

时间:2013-03-01 01:14:56

标签: ios objective-c xcode core-data

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

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

在app delegate中我创建了上下文

- (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.为什么它没有正确传递?

修改

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

2 个答案:

答案 0 :(得分:1)

从您的代码中,最可能的解释是firstController为零。你可以用这一行得到它:

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

但如果topViewController为零,则firstViewController为零。在以下几行中:

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

将消息发送到nil不是Objective-C中的错误,因此第一行是no-op。在上面的最后一行中,您将打印nil.managedObjectContext.concurrencyType,它将为0。

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

答案 1 :(得分:0)

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