2017-10-10 29 views
0

想象一下这样的代码:更新全班不会工作

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 
    } 

如何更新整个班级,而不必一次放入一个变量?

+0

请问您可以分享一些情况吗?例如,具有'storedVersions'属性的类的类定义,您提供的输入(即'data')以及您期望得到的结果。 – bdash

+0

hi @bdash,我编辑了我的问题以添加更多上下文,如果需要,我可以添加更多内容。我提供的输入和我的预期结果是“应该”打印(“版本”打印)。我的“storedVersions”应该包含与“版本”相同的值。 –

+0

您可以请分享包含正在执行的代码的类声明吗? – bdash

回答

1

当你这样做:

if let versions = data.flatMap({StoredVersions(value: $0.data()) }) { 
    try! self.realm.write { 
     self.storedVersions = versions 
    } 
} 

你正在创建一个新的,非托管StoredVersions对象。您需要调用realm.add(_:)将其添加到Realm,否则该对象仅存在于内存中。

如果你想更新现有StoredVersions对象,而不是创建一个新的,你应该使用Realm.add(_:update:),用于更新参数指定true。请注意,这需要您的类型声明主键属性,以便Realm知道哪个现有对象要更新。

+0

谢谢你的作品。但我认为更新1变量按我想要的方式工作是非常奇怪的,但是当更新整个类需要更多关键和更新的麻烦时。 –

+1

修改'self.storedVersions'的属性时,您正在修改由Realm管理_already_的对象的属性(毕竟,您只是从Realm中检索它)。这与创建新的_unmanaged_对象完全不同。 – bdash

+0

哈!现在我终于明白了!谢谢你的时间。 –