(对不起,如果这个问题有点令人困惑/不精确。我只是学习高级CoreData使用方法而且我不太了解术语和内容。)< / em>的
我有一个单身ng-show
,可以保存游戏中您需要的某些数据。例如,您可以从那里访问Game
(currentSite
是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
未知的新对象,它将被提取。
但是如果一个物体改变了呢?
我不确定上面的示例代码是否像预期的那样工作只是巧合。
感谢您的帮助/解释!我渴望了解这类东西。
答案 0 :(得分:1)
不,不保证。如果托管对象已在上下文中注册,则它将返回此对象。更重要的是,如果具有给定id的对象(NSManagedObjectId)在持久存储中不存在,那么只要您尝试使用其任何属性,您的应用就会崩溃。