2014-10-01 14 views
5

Tôi đang cố gắng áp dụng ReactiveCocoa trong ứng dụng iOS được viết bằng Swift. Thật không may, có vẻ như rac_valuesForKeyPath không hoạt động như mong đợi. Dưới đây là ví dụ:ReactiveCocoa rac_valuesForKeyPath không hoạt động trong 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)") 
     } 
    } 
} 

Ví dụ xuất ra như sau:

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

này có nghĩa là khối subcribeNext không được gọi.

Các đầu vào dự kiến ​​là:

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

Bất kỳ đầu mối làm thế nào để khắc phục vấn đề?

Trả lời

9

Nhu cầu quan sát được động

tôi mẫu của bạn để làm việc với đoạn mã sau

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

này hoạt động! Cảm ơn rất nhiều! –

+1

dường như hoạt động khi bạn thêm công cụ sửa đổi 'động' vào ví dụ đầu tiên –

+0

Quan sát khóa-giá trị là một cơ chế cho phép các đối tượng được thông báo về các thay đổi đối với các thuộc tính được chỉ định của các đối tượng khác. Bạn có thể sử dụng khóa-giá trị quan sát với một lớp Swift, miễn là lớp kế thừa từ lớp NSObject. Bạn có thể sử dụng ba bước sau để triển khai khóa-giá trị quan sát trong Swift. https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/AdoptingCocoaDesignPatterns.html –

Các vấn đề liên quan