ios – ReactiveCocoa rac_valuesForKeyPath在Swift中不起作用

前端之家收集整理的这篇文章主要介绍了ios – ReactiveCocoa rac_valuesForKeyPath在Swift中不起作用前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试在我用 Swift编写的iOS应用程序中采用ReactiveCocoa.不幸的是,看起来rac_valuesForKeyPath不能按预期工作.
这是一个例子:
  1. class Source: NSObject {
  2. var observable: String = "<Original>"
  3.  
  4. override init() {
  5. super.init()
  6.  
  7. dispatch_after(dispatch_time(DISPATCH_TIME_NOW,Int64(1 * NSEC_PER_SEC)),dispatch_get_main_queue(),{ () -> Void in
  8. self.observable = "<Updated>"
  9. println("Updated value to \(self.observable)");
  10. })
  11. }
  12. }
  13.  
  14. class Observer: NSObject {
  15. init(source: Source) {
  16. super.init()
  17.  
  18. source.rac_valuesForKeyPath("observable",observer: self).subscribeNext { (value: AnyObject!) -> Void in
  19. println(">>> Observable value changed: \(value)")
  20. }
  21. }
  22. }

该示例生成以下输出

  1. >>> Observable value changed: <Original>
  2. Updated value to <Updated>

这意味着未调用subcribeNext块.

预期的输入是:

  1. >>> Observable value changed: <Original>
  2. Updated value to <Updated>
  3. >>> Observable value changed: <Updated>

任何线索如何解决问题?

解决方法

可观察性需要是动态的

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

  1. class Source: NSObject {
  2. dynamic var string:String = "Initial Value"
  3.  
  4. override init() {
  5. super.init()
  6. }
  7. }
  8.  
  9. class Observer: NSObject {
  10.  
  11. init(source:Source) {
  12. super.init()
  13. source.rac_valuesForKeyPath("string",observer: self).subscribeNext { (newVal:AnyObject!) -> Void in
  14. println(newVal)
  15. }
  16. }
  17. }
  18.  
  19. class ViewController: UIViewController {
  20. var source:Source!
  21. var obs:Observer!
  22.  
  23. override func viewDidLoad() {
  24. super.viewDidLoad()
  25. source = Source()
  26. obs = Observer(source: source)
  27. source.string = "Another Value"
  28. }
  29. }

猜你在找的iOS相关文章