我正在用新的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)