因此,我知道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是安全的,但肯定不能保證。 –