在我的系统中,每个线程都有自己的托管对象上下文。
有时我想要一个特定对象的等效对象。
所以我做了这个类别
-(NSManagedObject *) moVersionForThisThread
{
NSManagedObjectID * moID = [self objectID];
NSManagedObject * mo= [[BGMDCRManagedObjectContextThreadHandler managedObjectContext]existingObjectWithID:moID error:nil];
return mo;
}
据我所知,[self objectID]是为所有线程保存的,existsObjectWithID也是threadSafe。对?我们总能找到合适的物品吗?
什么都不会出错?
右?
确保。
答案 0 :(得分:2)
我相信你已经错过了关于objectIDs线程安全的方法。在单独的线程上使用objectID是完全可以接受的,但是您需要在实例化该对象的线程上从托管对象中检索该objectID。换句话说,如果你在对象的原始线程以外的线程上调用moVersionForThisThread,你可能会遇到代码[self objectID]的线程问题。
我建议将此库插入您的项目以进行调试,如果您在错误的线程上访问托管对象,则会给您警告: https://github.com/GrahamDennis/GDCoreDataConcurrencyDebugging