如果另一个(私有)managedObjectContext更改并保存,managedObjectContext.object(with :)是否总是重新获取数据?

时间:2017-03-02 12:50:15

标签: ios swift core-data nsmanagedobjectcontext

(对不起,如果这个问题有点令人困惑/不精确。我只是学习高级CoreData使用方法而且我不太了解术语和内容。)< / em>的

我有一个单身ng-show,可以保存游戏中您需要的某些数据。例如,您可以从那里访问GamecurrentSite是CoreData Site)以获取用户当前所在的Entity

Site

您看,我使用// I created the Site in a background queue (when the game started), then saved the objectID and here I load the objectID public var currentSiteObjectID: NSManagedObjectID { let objectIDuri = UserDefaults.standard.url(forKey: Keys.forGameObject.currentSiteObjectIDURI)! return appDelegate.persistentContainer.persistentStoreCoordinator.managedObjectID(forURIRepresentation: objectIDuri)! } // managedObjectContext is the one running on the main queue public var currentSite: Site! { return managedObjectContext.object(with: currentSiteObjectID) as! Site } 方法检索currentSite

此方法的文档说:

  

返回指定ID的对象。

     

如果对象未注册   在上下文中,它可以作为错误获取或返回。 (...)

我对以下内容不太确定:

managedObjectContext.object(with:)

第二个// Each Site has resources that you can access like this print(Game.shared.currentSite!.resourceSet!.iron) appDelegate.persistentContainer.performBackgroundTask { (context) in let currentSite = context.object(with: Game.shared.currentSiteObjectID) as! Site // Here I increase the iron resource currentSite.resourceSet!.iron += 42 do { try context.save() } catch let error as NSError { fatalError("\(error.debugDescription)") } DispatchQueue.main.async { print(Game.shared.currentSite!.resourceSet!.iron) } } 函数正在使用主队列的print(与managedObjectContext中使用的私有队列不同)。

它确实打印了:

performBackgroundTask {...}

我的问题:是否保证50 // the start value 92 返回当前对象(即最新),即使它已在另一个managedObjectContext.object(with:)中更改了?文档说如果它是context未知的新对象,它将被提取。 但是如果一个物体改变了呢?

我不确定上面的示例代码是否像预期的那样工作只是巧合。

感谢您的帮助/解释!我渴望了解这类东西。

1 个答案:

答案 0 :(得分:1)

不,不保证。如果托管对象已在上下文中注册,则它将返回此对象。更重要的是,如果具有给定id的对象(NSManagedObjectId)在持久存储中不存在,那么只要您尝试使用其任何属性,您的应用就会崩溃。