我爱 Realm 并且我爱 Bond 。它们都使应用程序创建成为一种乐趣。所以我想知道连接 Realm 和 Bond 的最佳方式是什么?在 Realm 中,我们可以存储基本类型,例如 IntString ,例如但是在 Bond 中,我们使用 Dynamic s 和 Bond s。我发现连接 Realm 和 Bond 的唯一方法如下:

class TestObject: RLMObject {

   dynamic var rlmTitle: String = ""
   dynamic var rlmSubtitle: String = ""

   var title: Dynamic<String>
   var subtitle: Dynamic<String>

   private let titleBond: Bond<String>!
   private let subtitleBond: Bond<String>!

   init(title: String, subtitle: String) {
      self.title = Dynamic<String>(title)
      self.subtitle = Dynamic<String>(subtitle)

      super.init()

      self.titleBond = Bond<String>() { [unowned self] title in self.rlmTitle = title }
      self.subtitleBond = Bond<String>() { [unowned self] subtitle in self.rlmSubtitle = subtitle }

      self.title ->> titleBond
      self.subtitle ->> subtitleBond
   }
}

但它确实缺乏简单和优雅,并产生了大量的锅炉代码。有什么办法可以做得更好吗?

最佳答案

Realm 支持 KVO 和 Bond 4,您可以扩展 Realm 对象以提供 Observable 变体。它有一些样板,但它很干净,没有黑客攻击。

class Dog: Object {
  dynamic var name = ""
  dynamic var birthdate = NSDate(timeIntervalSince1970: 1)
}

extension Dog {

  class ObservableDog {
    let name: Observable<String>
    let birthdate: Observable<NSDate>

    init(dog: Dog) {
      name = Observable(object: dog, keyPath: "name")
      birthdate = Observable(object: dog, keyPath: "birthdate")
    }
  }

  func observableVariant() -> Dog.ObservableDog {
    return ObservableDog(dog: self)
  }
}

比你能做的:
let myDog = Dog().observableVariant()

myDog.name.observe { newName in
  print(newName)
}

myDog.name.bindTo(nameLabel.bnd_text)

realm.write {
  myDog.name.value = "Jim"
}

关于ios - 连接 Realm 和 SwiftBond 的最佳方式是什么,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29155556/

10-13 03:43