Core data 从NSO操作中删除主线程中的NSManagedObject
从NSOperation对主线程上的NSManagedObjectContext调用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
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。