【问题标题】:KVO or how to listen for a property changes from outside in SwiftKVO 或如何在 Swift 中从外部监听属性更改
【发布时间】:2016-03-04 17:45:40
【问题描述】:

我有一个带有属性的实例,我想监听来自其他实例的更新。

例如Menu类有一个属性badgeCount,我想监听badgeCount的任何更新,例如当badgeCount改变时。我希望我的 ViewController 在修改 badgeCount 以了解实际数据后进行回调。

目标是我可以将 KVO 用于列出的属性,我如何在 Swift 中使用 KVO。我是 Swift 新手。

【问题讨论】:

  • 你也可以使用 KVO,但是你必须使用 NSObject 之类的。相反,我建议您使用通知或推出自己的更改观察机制。这两种选择都很好,根据具体情况,您可能更喜欢其中一种。
  • 看看 Bond 框架,他们有一个 Observable 类型可以帮助你:github.com/SwiftBond/Bond

标签: objective-c swift swift2 key-value-observing


【解决方案1】:

如果你想在swift中使用KVO,有两个要求:

  • 您要在其上执行 KVO 的类必须继承自 NSObject(或任何 NSObject 子类)
  • 需要观察的属性必须标记为dynamic

一个代码示例是:

class Menu: NSObject {
  dynamic var badgeCount: Int = 0
}

然后,您可以使用通常的menuInstance.addObserver(self, forKeyPath: "badgeCount", options: NSKeyValueObservingOptions(), context: nil)

但是这个解决方案不是很swifty


更好的解决方案是(不是详尽的列表):

使用 swift 的 didSet/willSet 调用一些回调

class Menu {
  var badgeCount: Int = 0 {
     didSet {
        badgeCountChangedListener(badgeCount)
     }
  }

  init(badgeCountChangedListener: (Int -> Void)) {
    self.badgeCountChangedListener = badgeCountChangedListener
  }

  private let badgeCountChangedListener: (Int -> Void)
}

使用RxSwift'sVariable类型

class Menu {
   let badgeCount = Variable(0)
}

// and from where you observe
menuInstance.badgeCount.subscribeNext { badgeCount in
    print(badgeCount)
}

【讨论】:

  • 谢谢,但似乎我无法添加 menuInstance.addObserver,甚至没有名为 addObserver 的方法
  • 如答案中所述>您要在其上执行 KVO 的类必须继承自 NSObject
猜你喜欢
  • 2018-08-21
  • 2015-09-08
  • 1970-01-01
  • 2014-02-14
  • 1970-01-01
  • 1970-01-01
  • 2020-10-13
  • 2018-03-01
  • 2019-09-29
相关资源
最近更新 更多