Ios RKEYPATH的反应可可rac_值不';我不能在斯威夫特工作

Ios RKEYPATH的反应可可rac_值不';我不能在斯威夫特工作,ios,swift,reactive-cocoa,Ios,Swift,Reactive Cocoa,我正试图在我用Swift编写的iOS应用程序中采用ReactiveCocoa。不幸的是,rac_valuesForKeyPath似乎没有按预期工作。 下面是一个例子: class Source: NSObject { var observable: String = "<Original>" override init() { super.init() dispatch_after(dispatch_time(DISPATCH_TI

我正试图在我用Swift编写的iOS应用程序中采用ReactiveCocoa。不幸的是,rac_valuesForKeyPath似乎没有按预期工作。 下面是一个例子:

class Source: NSObject {
    var observable: String = "<Original>"

    override init() {
        super.init()

        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), { () -> Void in
            self.observable = "<Updated>"
            println("Updated value to \(self.observable)");
        })
    }
}

class Observer: NSObject {
    init(source: Source) {
        super.init()

        source.rac_valuesForKeyPath("observable", observer: self).subscribeNext { (value: AnyObject!) -> Void in
            println(">>> Observable value changed: \(value)")
        }
    }
}
类源:NSObject{
可观察变量:String=“”
重写init(){
super.init()
调度后(调度时间(现在调度时间,Int64(每秒1*NSEC)),调度获取主队列(),{()->Void in
self.observable=“”
println(“更新到\(自可观察)的值”);
})
}
}
类观察者:NSObject{
初始化(源:源){
super.init()
source.rac_valuesForKeyPath(“可观察的”,观察者:self).subscribeNext{(值:AnyObject!)->中的Void
println(“>>>可观察值已更改:\(值)”)
}
}
}
该示例生成以下输出:

>>> Observable value changed: <Original>
Updated value to <Updated>
>>可观测值已更改:
更新值至
这意味着没有调用下一个块

预期的投入是:

>>> Observable value changed: <Original>
Updated value to <Updated>
>>> Observable value changed: <Updated>
>>可观测值已更改:
更新值至
>>>可观测值变化:

有没有解决问题的线索?

可观察对象需要是动态的

我让您的示例使用以下代码

class Source: NSObject {
  dynamic var string:String = "Initial Value"

  override init() {
    super.init()
  }
}

class Observer: NSObject {

  init(source:Source) {
    super.init()
    source.rac_valuesForKeyPath("string", observer: self).subscribeNext { (newVal:AnyObject!) -> Void in
      println(newVal)
    }
  }
}

class ViewController: UIViewController {
  var source:Source!
  var obs:Observer!

  override func viewDidLoad() {
    super.viewDidLoad()
    source = Source()
    obs = Observer(source: source)
    source.string = "Another Value"
  }
}

在第一个示例中添加“dynamic”修饰符时似乎起作用。Key value observing是一种机制,允许在其他对象的指定属性发生更改时通知对象。您可以对Swift类使用键值,只要该类继承自NSObject类。您可以使用这三个步骤在Swift中实现键值观察。