0

當在NSOperation的主線程上的NSManagedObjectContext上調用deleteObject:時,我還需要引用主線程上的objectID嗎?目前,我在主線程從的NSOperation以下列方式刪除NSManagedObject ...從NSOperation中刪除主線程中的NSManagedObject

NSManagedObjectContext *mainContext = [[[UIApplication sharedApplication] delegate] managedObjectContext]; 

- (void)deleteObject:(NSManagedObjectID *)objectID 
{ 
    // Delete on main context on the main thread 
    [mainContext performSelectorOnMainThread:@selector(deleteObject:) 
           withObject:[mainContext objectWithID:objectID] 
          waitUntilDone:YES]; 
} 

它的工作,但我想,以確保它不會對我以後炸燬。我不確定的是,如果[mainContext objectWithID:objectID]引用NSOperation中的NSManagedObjectContext,或者因爲該方法調用在performSelectorOnMainThread:withObject:waitUntilDone:之內,是否全部在主線程上執行?

回答

2

NSManagedObjectID的實例可以跨線程邊界共享。但是,您對mainContext objectWithID:的調用將獲得實際的對象,這不是線程安全的。

你應該做的可能是把它包裝在一個可以在主隊列上執行的選擇器或塊中。

dispatch_async(dispatch_get_main_queue(), ^{ 
    NSManagedObjectContext *mainContext = [[[UIApplication sharedApplication] delegate] managedObjectContext]; 
    NSManagedObject *obj = [mainContext objectWithID:objectID]; 
    if (obj) { 
     [mainContext deleteObject:obj]; 
    } 
}) 

或者你可以有你的主線程隊列中做到這一點:

[mainContext performBlock:^{ 
    NSManagedObject *obj = [mainContext objectWithID:objectID]; 
    if (obj) { 
     [mainContext deleteObject:obj]; 
    } 
}] 

當然,這一切引出了一個問題,爲什麼你想刪除基於一個主線程對象在另一個線程上的NSOperation實例的上下文?

+0

我正在使用你的第一種方法(GCD)。謝謝!要回答你的問題,我正在從一個JSON文件更新Core Data持久性存儲,我正在下載並在NSOperation中進行解析。我根據當前的持久性存儲NSManagedObjects檢查JSON對象。如果持久性存儲包含不在JSON中的對象,則刪除NSManagedObject。 –