在1次内更新域中的整个类Swift无效
想象一下这个代码:在1次内更新域中的整个类Swift无效,swift,realm,Swift,Realm,想象一下这个代码: class StoredVersions: Object{ @objc dynamic var minimumAppVersion = 0.0 @objc dynamic var sets = 0.0 } class LoadViewController: UIViewController { let realm = try! Realm() override func viewDidLoad() { super.viewDidLoad()
class StoredVersions: Object{
@objc dynamic var minimumAppVersion = 0.0
@objc dynamic var sets = 0.0
}
class LoadViewController: UIViewController {
let realm = try! Realm()
override func viewDidLoad() {
super.viewDidLoad()
let db = Firestore.firestore()
var newestVersions = StoredVersions()
if let resultsStoredVersion = self.realm.objects(StoredVersions.self).first{
print("found stored versions: \(resultsStoredVersion)")
self.storedVersions = resultsStoredVersion
}else{
try! self.realm.write {
print("no stored versions")
self.realm.add(self.storedVersions)
}
}
db.collection("data").document("version").getDocument(completion: { (data, someError) in
if let versions = data.flatMap({StoredVersions(value: $0.data()) }) {
try! self.realm.write {
self.storedVersions = versions
}
}
})
}
storedVersions已更新,但当我重新启动应用程序时,storedVersions将返回其初始状态。我确实看到了“找到存储版本”的打印
如果我一次只写一个变量,它就工作了。看起来是这样的:
try! self.realm.write {
self.storedVersions.sets = versions.sets
}
如何更新整个类而不必一次输入一个变量?执行此操作时:
if let versions = data.flatMap({StoredVersions(value: $0.data()) }) {
try! self.realm.write {
self.storedVersions = versions
}
}
您正在创建一个新的非托管StoredVersions
对象。您需要调用realm.add(:)
将其添加到realm,否则该对象只存在于内存中
如果要更新现有的
StoredVersions
对象,而不是创建一个新对象,则应改为使用Realm.add(uquo:update:)
,为update参数指定true
。请注意,这要求您的类型声明一个主键属性,以便Realm知道要更新哪个现有对象。您能再共享一点上下文吗?例如,具有storedVersions
属性的类的类定义、您提供的输入(即数据
),以及您期望的结果。嗨@bdash,我编辑了我的问题以添加更多上下文,如果您愿意,我可以添加更多上下文。我提供的输入和预期结果是“应该”打印(“版本”打印)。我的“storedVersions”应包含与“versions”相同的值。能否共享包含正在执行的代码的类声明?@bdash我现在添加了UIViewController代码。storedVersions会在应用程序重新启动时自动删除。谢谢,它可以正常工作。但我觉得很奇怪的是,更新1个变量的方式符合我的要求,但是当更新整个类时,需要更多的键和更新。当您修改self.storedVersions
的属性时,您修改的是一个已经由Realm管理的对象的属性(毕竟您只是从Realm中检索到它). 这与创建新的非托管对象完全不同。哈!现在我终于明白了!谢谢你抽出时间。