[英]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.