簡體   English   中英

核心數據並發類型無法按預期工作

[英]Core Data concurrency type not working as expected

對於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。 但是,當我檢查上下文時,我剛發送到firstcontroller時得到0。為什么它傳遞不正確?

編輯

另外,我可以通過AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]獲取managedObjectContext,並且可以看到並發類型為MAIN,但是如果在下一行中執行self.managedObjectContext = appDelegate.managedObjectContext然后檢查self的並發類型。 ManagedObjectContext的值為0。似乎將其從App委托分配給控制器會丟失並發類型。

從您的代碼中,最可能的解釋是firstController為nil。 您可以使用以下代碼獲取它:

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。

這看起來不像是核心數據問題,而更像是配置視圖控制器的問題。

我是個白痴。 另一位開發人員將與所有控制器相同的核心數據堆棧方法放入Base控制器中。 發生的事情是我能夠設置控制器上下文,但是基本控制器將創建自己的上下文並覆蓋傳入的上下文。刪除此垃圾代碼解決了我的問題。 這回答了我的問題,所以我將結束這個問題。 請不要投反對票,我們所有人都有編碼過的屁。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM