KVO或如何在Swift中从外部听取房产变化

时间:2016-03-04 17:45:41

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

我有一个带有属性的实例,我想从其他实例中侦听更新。

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

在目标是我可以用于列出属性的KVO,我怎样才能在Swift中使用KVO。我是斯威夫特的新人。

1 个答案:

答案 0 :(得分:3)

如果你想在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's Variable类型

class Menu {
   let badgeCount = Variable(0)
}

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