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。 –