objective-c - KVO 或如何在 Swift 中监听来自外部的属性更改

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

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

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

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

最佳答案

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

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

代码示例是:

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

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

但是这个解决方案不太 swift


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

使用 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 变量类型

class Menu {
   let badgeCount = Variable(0)
}

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

关于objective-c - KVO 或如何在 Swift 中监听来自外部的属性更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35802715/

相关文章:

iphone - 如何经常检查 GPS 信号强度

iphone - UILocalNotification - 如何发现用户操作是否来自通知中心?

ios - 计算截断 UILabel 的部分文本

ios - 错误 : missing property on object 'AppDelegate *'

swift - 如何在@dynamicMemberLookup 中快速声明 "throws"为 `subscript(dynamicMember:)`?

swift - 将具有多个泛型类型的枚举作为参数传递

swift - Clang Static Analyzer 可以和 Swift 一起使用吗?

ios - 适用于 iOS 14.5 的 SwiftUI NavigationLink 无法正常工作

ios - ReactiveCocoa 4.0 :- Unable to map the NSURLSession. sharedSession().rac_dataWithRequest

swift2 - swift : Instance member cannot be used on type