因此,我知道NSManagedObjects
不是线程安全的,从后台线程获取对象的最佳方式是使用[context objectWithId:id];
,因此传递对象标识而不是实际对象。从后台线程访问NSManagedObject
比方说,我有我的AppDelegate
全球NSManagedObject
(不是最好的设计模式,但只是举例)NSManagedObject *myObject;
它是安全访问该对象的objectId
从后台线程?就像这样:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
objectId = appDelegate.myObject.objectId;
//is this thread safe?
}
我同意你的解决方案,但我需要了解一件事情, NSManagedObject的objectID是不可变属性(第一次保存后)。是不是可以安全地从任何线程访问不可变属性? – PushpRaj
@PushpRaj一般来说,让一个属性不可变并不能保证线程安全。对于NSManagedObject,文档非常明确,您不应该将NSManagedObjects从一个线程传递到另一个线程,这就是示例代码正在执行的操作(无论您正在访问哪个属性)。你说得对,实现细节*很可能意味着从后台线程访问objectID是安全的,但肯定不能保证。 –