如何观察exectivecocoa在Swift中发生变化



我正在用新的reactivecocoa reactiveswift写下swift。我正在尝试使用新的ExestiveCocoa框架来执行以下操作(在exectivecocoa 2.5中):

[[RACObserve(user, username) skip:1] subscribeNext:^(NSString *newUserName) {
    // perform actions...
}];

经过一些研究,我仍然无法弄清楚如何做。请帮忙!非常感谢!

您的摘要通过KVO起作用,这仍然可以使用Swift中的最新RAC/RA,但不是不再推荐的方法。

使用属性

建议的方法是使用具有值并可以观察到的Property

这是一个示例:

struct User {
  let username: MutableProperty<String>
  init(name: String) {
    username = MutableProperty(name)
  }
}
let user = User(name: "Jack")
// Observe the name, will fire once immediately with the current name
user.username.producer.startWithValues { print("User's name is ($0)")}
// Observe only changes to the value, will not fire with the current name
user.username.signal.observeValues { print("User's new name is ($0)")}
user.username.value = "Joe"

将打印

用户的名字是杰克

用户的名字是乔

用户的新名称是Joe

使用kvo

如果由于某种原因您仍然需要使用KVO,那么您可以如何做到这一点。请记住,KVO仅在NSObject的显式子类上起作用,如果类用Swift编写,则需要用@objc dynamic

对该属性进行注释。
class NSUser: NSObject {
  @objc dynamic var username: String
  init(name: String) {
    username = name
    super.init()
  }
}
let nsUser = NSUser(name: "Jack")
// KVO the name, will fire once immediately with the current name
nsUser.reactive.producer(forKeyPath: "username").startWithValues { print("User's name is ($0)")}
// KVO only changes to the value, will not fire with the current name
nsUser.reactive.signal(forKeyPath: "username").observeValues { print("User's new name is ($0)")}
nsUser.username = "Joe"

将打印

用户的名称是可选的(jack)

用户的新名称是可选的(JOE)

用户的名称是可选的(JOE)

相关内容

  • 没有找到相关文章

最新更新