我有這樣的一個方法的類:非法訪問Core Data上下文:什麼線程是AppDelegate中提供的上下文的所有者?
- (void)getEntities
{
AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
NSManagedObjectContext *mainContext = appDelegate.managedObjectContext;
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"MyEntity"];
NSArray *entities = [mainContext executeFetchRequest:fetchRequest error:nil];
for (NSManagedObject *item in entities) {
NSLog(@"Name: %@", ((MyEntity *)item).name);
}
}
我已經啓用了com.apple.CoreData.ConcurrencyDebug 1
,當我把這種方法(在主線程)我得到的錯誤:
CoreData: error: The current thread is not the recognized owner of this NSManagedObjectContext(0x16d40160). Illegal access during executeFetchRequest:error:
但是,如果我這樣做:
- (void)getEntities
{
NSManagedObjectContext *privateContext = [CoreDataStack getPrivateContext];
if (privateContext != nil) {
[privateContext performBlock: ^{
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"MyEntity"];
NSArray *entities = [privateContext executeFetchRequest:fetchRequest error:nil];
for (NSManagedObject *item in entities) {
NSLog(@"Name: %@", ((MyEntity *)item).name);
}
}];
}
}
而且我在主線程中調用它,它似乎沒有導致這樣的核心數據錯誤...爲什麼?我一直假設默認提供的NSManagedObjectContext
在AppDelegate
和我正在檢索屬於主線程...我做錯了或失蹤?
我試圖從AppDelegate
的上下文中獲取的實體,這些上下文以前從私有隊列中創建的上下文中保存(類似於我在第二個代碼段中創建的上下文)。這可能是錯誤的原因嗎?這樣的私人環境不是任何其他環境的孩子,我在保存時沒有錯誤。
我需要通過在主線程中使用私有上下文來獲取我已經存儲的實體,以便在執行UIViewController
時將它們保存在NSArray
中。
非常感謝。
你對這種情況的第一次用法是什麼?主線程中的所有內容都是?你創建上下文的代碼是什麼? – Wain
你確定你總是在主線程中調用該方法嗎? –
@Wain我第一次從一個不是主要的線程中調用AppDelegate的上下文,所以這似乎是問題,謝謝。 – AppsDev