2016-01-05 12 views
6

Tôi đang khám phá Rx và tôi muốn xem liệu tôi có thể xác định đầu vào đầu ra của một số yếu tố giao diện người dùng liên quan đến nhau hay không, trước khi thành phần của thành phần này được khởi tạo.Có cách nào để khai báo cập nhật một cách có thể quan sát được sau khi đã được xác định không?

Đây là những gì nó sẽ như thế nào:

class ViewController: UIViewController { 
    @IBOutlet weak var button: UIButton! 

    var child: ButtonComponent! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     let buttonInput = PublishSubject<()>() 
     let buttonOutput = buttonInput 
      .scan(0) { count, _ in 
       count + 1 
      } 
      .map { $0.description } 

     self.child = ButtonComponent(
      button: self.button, 
      input: buttonInput, 
      output: buttonOutput 
     ) 
    } 
} 

class ButtonComponent { 
    weak var button: UIButton! 
    let disposeBag = DisposeBag() 

    init(button: UIButton, input: PublishSubject<()>, output: Observable<String>) { 
     self.button = button 

     output 
      .subscribeNext { string in 
       button.setTitle(string, forState: .Normal) 
      } 
      .addDisposableTo(disposeBag) 

     button.rx_tap 
      .subscribeNext { 
       input.onNext($0) 
      } 
      .addDisposableTo(disposeBag) 
    } 
} 

Vấn đề ở đây là tôi đang sử dụng PublishSubject để đẩy bản cập nhật cho dòng đầu vào, mà là bắt buộc và khuyến cáo chống lại. Liệu Rx cung cấp một cách để bằng cách nào đó thêm chuỗi vào một quan sát đã chạy?

+1

trả lời cho câu hỏi cuối cùng của bạn là có, bởi sử dụng 'Observable.Merge'. Mặc dù tôi không hoàn toàn chắc chắn làm thế nào để áp dụng nó ở đây ... – supertopi

Trả lời

0

Sau một số nghiên cứu, câu trả lời dường như là không. Đơn giản chỉ vì nếu bạn muốn thêm một chuỗi vào một quan sát đang chạy, đó là một đột biến. Và không có cách khai báo nào để làm đột biến.

Tôi đã xem một thư viện javascript có tên là cycle.js, chính xác là điều tương tự, và chúng đã giải quyết nó theo cách tương tự, với một ReplaySubject.

Điều duy nhất bạn có thể làm là làm cho nó trông đẹp hơn một chút bằng cách làm

button.rx_tap 
    .subscribe(input) 

Thay vì

button.rx_tap 
    .subscribeNext { 
     input.onNext($0) 
    } 
+0

Điều này là không đúng sự thật. Toán tử 'merge' sẽ cho phép bạn thêm vào một quan sát đang chạy. – Enigmativity

+0

'hợp nhất' trả về một quan sát mới, nó không thể biến đổi một quan sát được. – mschumacher

+0

Có, nhưng nếu bạn chèn hợp nhất vào truy vấn tại thời gian biên dịch, bạn có thể chèn các giá trị vào thời gian chạy. – Enigmativity

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