Core data 从NSO操作中删除主线程中的NSManagedObject

Core data 从NSO操作中删除主线程中的NSManagedObject,core-data,nsmanagedobject,nsoperation,nsmanagedobjectcontext,Core Data,Nsmanagedobject,Nsoperation,Nsmanagedobjectcontext,从NSOperation对主线程上的NSManagedObjectContext调用deleteObject:时,是否还需要引用主线程上的objectID?目前,我正在以以下方式从NSOperation中删除主线程中的NSManagedObject NSManagedObjectContext *mainContext = [[[UIApplication sharedApplication] delegate] managedObjectContext]; - (void)deleteObj

从NSOperation对主线程上的NSManagedObjectContext调用
deleteObject:
时,是否还需要引用主线程上的objectID?目前,我正在以以下方式从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:
中,所以所有调用是否都在主线程上执行?

NSManagedObjectID的实例可以跨线程边界安全共享。但是,对mainContextObjectWithId:的调用将获得实际对象,这不是线程安全的

您可能应该做的是将其包装在一个选择器或块中,该选择器或块可以在主队列上执行

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实例中删除基于主线程的上下文中的对象?

我使用的是第一种方法(GCD)。谢谢为了回答您的问题,我正在从一个JSON文件中更新一个核心数据持久存储,我正在NSO操作中下载并解析该文件。我根据当前的持久存储NSManagedObject检查JSON对象。如果持久存储包含不在JSON中的对象,我将删除NSManagedObject。