2014-10-01 11 views
5

Sto provando ad adottare ReactiveCocoa nella mia applicazione iOS scritta in Swift. Sfortunatamente, sembra che rac_valuesForKeyPath non funzioni come previsto. Ecco l'esempio:ReactiveCocoa rac_valuesForKeyPath non funziona in 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)") 
     } 
    } 
} 

L'esempio produce il seguente output:

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

Ciò significa blocco subcribeNext non è stato chiamato.

L'input atteso è:

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

Qualsiasi idea di come risolvere il problema?

risposta

9

Le esigenze osservabili ad essere dinamica

Ho ricevuto il tuo campione di lavorare con il seguente codice

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

Questo funziona! Molte grazie! –

+1

sembra funzionare quando si aggiunge il modificatore 'dinamico' al primo esempio –

+0

L'osservazione valore-chiave è un meccanismo che consente agli oggetti di essere notificati delle modifiche alle proprietà specificate di altri oggetti. È possibile utilizzare l'osservazione dei valori-chiave con una classe Swift, a condizione che la classe erediti dalla classe NSObject. È possibile utilizzare questi tre passaggi per implementare l'osservazione dei valori-chiave in Swift. https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/AdoptingCocoaDesignPatterns.html –

Problemi correlati