0

我有這樣的一個方法的類:非法訪問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); 
      } 
     }]; 
    } 
} 

而且我在主線程中調用它,它似乎沒有導致這樣的核心數據錯誤...爲什麼?我一直假設默認提供的NSManagedObjectContextAppDelegate和我正在檢索屬於主線程...我做錯了或失蹤?

我試圖從AppDelegate的上下文中獲取的實體,這些上下文以前從私有隊列中創建的上下文中保存(類似於我在第二個代碼段中創建的上下文)。這可能是錯誤的原因嗎?這樣的私人環境不是任何其他環境的孩子,我在保存時沒有錯誤。

我需要通過在主線程中使用私有上下文來獲取我已經存儲的實體,以便在執行UIViewController時將它們保存在NSArray中。

非常感謝。

+0

你對這種情況的第一次用法是什麼?主線程中的所有內容都是?你創建上下文的代碼是什麼? – Wain

+0

你確定你總是在主線程中調用該方法嗎? –

+0

@Wain我第一次從一個不是主要的線程中調用AppDelegate的上下文,所以這似乎是問題,謝謝。 – AppsDev

回答

0

看來問題不在於此方法,而是我在AppDelegate中對上下文進行了初始化:在調用問題中的方法之前,在某些情況下,我第一次從一個隊列中檢索上下文, t主線程,並且這似乎導致上下文在其他隊列中被初始化。

相關問題