2016-04-27 14 views
5

Việc triển khai rx cung cấp BehaviorSubject<T>Variable<T> làm cơ chế để mô hình hóa các thuộc tính thay đổi theo thời gian (một thay thế hữu ích cho C# INotifyPropertyChanged).Giao diện BehaviorSubject chỉ đọc có tồn tại trong RX hay không, có phải là một ý tưởng tồi để tạo một giao diện không?

Nói chung chúng được tiếp xúc như Observable<T> nhưng nó sẽ hữu ích hơn để vạch trần tính chất như một cái gì đó như:

class ObservableValue<T> : Observable<T>{ 
    var currentValue:T { get } 
} 

này có thể được tạo ra dọc theo những dòng trong nhanh chóng:

class ObservableValue<Element> : ObservableType { 

    typealias E = Element 

    private let subject:BehaviorSubject<E> 

    var currentValue:E { 
     get { 
      return try! subject.value() 
     } 
    } 

    init(subject:BehaviorSubject<E>) { 
     self.subject = subject 
    } 

    func subscribe<O: ObserverType where O.E == E>(observer: O) -> Disposable { 
     return self.subject.subscribe(observer) 
    } 

}

Điều này đã tồn tại chưa? và nếu không phải là nó bởi vì nó chống lại các mục tiêu của Rx?

Cách duy nhất xung quanh nó là phơi bày một giá trị hiện tại riêng biệt hoặc ghi người tiêu dùng giả định việc triển khai cụ thể đằng sau Quan sát được phơi sáng là một BehaviourSubject hoặc một nơi nào đó trong chuỗi replay() đã xảy ra, ví dụ: đoạn sau không làm cho nó rõ ràng rằng ngay sau khi tôi đăng ký tôi sẽ nhận được một giá trị:

class MyViewModel { 
    // 'I will notify you of changes perhaps including my current value' 
    myProperty:Observable<String> 
} 

do đó, mã đã được viết như thể 'không đồng bộ' của nó với một giả định cơ bản nó sẽ hoạt động trong một gần như cách đồng bộ thay vì:

class MyViewModel { 
    // 'I have a current value and will notify you of changes going forward' 
    myProperty:ObservableValue<String> 
} 

Trả lời

1

Hãy suy nghĩ và thảo luận nó một chút có lẽ là lý do không (và có lẽ không nên tồn tại) là giới thiệu trạng thái truy cập bất hợp pháp.

Các cơ chế duy trì trạng thái khác (chẳng hạn như scan) làm như vậy trong giới hạn các chuỗi quan sát được kết nối chứ không phải là cuộc gọi trực tiếp 'kết thúc' như 'cho tôi giá trị ngay bây giờ'.

Có lẽ nó sẽ có vị trí của nó trong một phương pháp tiếp cận phản ứng/bắt buộc lai nhưng nó có thể cản trở toàn bộ phong cách phản ứng.

Tương tự như sử dụng lời hứa hoặc công việc trong một nửa mã sau đó hoàn nguyên về mã chặn đồng bộ trong các phần khác.

0

Trong hầu hết các trường hợp, những gì mọi người làm là tạo mô hình chế độ xem chuẩn hiển thị các thuộc tính thông qua INotifyPropertyChanged. Điều này cho phép các phần tử giao diện người dùng liên kết với chúng và nhận các sự kiện thay đổi thuộc tính và giữ cho giao diện người dùng được đồng bộ hóa.

Sau đó, nếu bạn muốn một IObservable cho thuộc tính nói rằng bạn tận dụng lợi thế của các toán tử Rx chuẩn biến sự kiện thành IObservable. Bạn có thể google này để tìm thấy nhiều triển khai khác nhau. Nói chung, bạn sẽ tạo và tiêu thụ các quan sát này từ một cái gì đó đang quan sát mô hình xem thay vì phơi bày chúng trực tiếp trên mô hình khung nhìn.

+0

Điều đó sẽ làm việc trong Rx.NET vì bạn có INotifyPropertyChanged nhưng trong nhanh chóng bạn không (gần nhất là KVO mà chỉ là trên lớp con NSObject). Ngoài ra tôi không chắc tôi thích ý tưởng phơi bày một get/set, một INotifyPropertyChanged và một Observable ở đâu đó - nếu tôi đang tạo viewmodel tại sao tôi không làm thẳng nó với các quan sát thay vì trộn các hệ thống sự kiện. – Cargowire

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