2014-10-01 59 views
5

我試圖在我寫的Swift中的iOS應用程序中採用ReactiveCocoa。不幸的是,它看起來像rac_valuesForKeyPath不能按預期工作。 這裏的例子:ReactiveCocoa rac_valuesForKeyPath在Swift中不起作用

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)") 
     } 
    } 
} 

此例產生以下輸出:

>>> Observable value changed: <Original> 
Updated value to <Updated> 

這意味着subcribeNext塊不被調用。

預期的輸入是:

>>> Observable value changed: <Original> 
Updated value to <Updated> 
>>> Observable value changed: <Updated> 

任何線索如何解決這個問題?

回答

9

可觀察到的需求是動態的

我得到你的樣品用下面的代碼

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" 
    } 
} 
+0

這工作的人!非常感謝! – 2014-10-13 11:12:51

+1

在向第一個示例中添加「動態」修飾符時似乎工作 – 2015-03-09 17:25:40

+0

鍵值觀察是一種機制,允許通知對象更改其他對象的指定屬性。只要該類繼承自NSObject類,就可以使用Swift類的鍵值觀察。您可以使用這三個步驟在Swift中實現鍵值觀察。 https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/AdoptingCocoaDesignPatterns.html – 2015-03-09 17:28:57

相關問題