【问题标题】:Does a read only BehaviorSubject interface exist in RX and if not, is it a bad idea to make one?RX 中是否存在只读 BehaviorSubject 接口,如果不存在,制作一个是不是一个坏主意?
【发布时间】:2022-03-11 08:26:58
【问题描述】:

rx 的实现提供了BehaviorSubject<T>Variable<T> 作为对随时间变化的属性进行建模的机制(C# INotifyPropertyChanged 的​​有用替代品)。

通常这些公开为Observable<T>,但将属性公开为以下内容会更有用:

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

这可以在 swift 中按照以下方式创建:

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

}

这已经存在了吗?如果不是,是不是因为它违背了 Rx 的目标?

解决它的唯一方法是公开一个单独的 currentValue 或编写消费者假设公开的 Observable 背后的具体实现是 BehaviourSubject 或在链中的某个地方发生了 replay() 例如下面的 sn-p 并没有明确表明,只要我订阅,我就会得到一个值:

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

所以代码必须像“异步”一样编写,并假设它将以几乎同步的方式运行,而不是:

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

【问题讨论】:

    标签: swift system.reactive rx-swift


    【解决方案1】:

    经过深思熟虑并对其进行了更深入的讨论,推测它不存在(也许不应该存在)的原因是它引入了命令式访问状态。

    其他维护状态的机制(例如scan)在链式可观察对象的范围内执行此操作,而不是像“立即给我价值”这样的“死胡同”直接调用。

    也许它会在混合反应式/命令式方法中占有一席之地,但它可能只会阻碍对反应式风格的完全接受。

    这类似于在一半代码中使用承诺或任务,然后在其他部分恢复为同步阻塞代码。

    【讨论】:

    • 它作为驱动程序存在于 RxCocoa 中,对于 UI 来说这很不错
    【解决方案2】:

    在大多数情况下,人们所做的是创建一个标准视图模型,通过 INotifyPropertyChanged 公开属性。这允许 UI 元素绑定到它们并接收属性更改事件并保持 UI 同步。

    然后,如果您想要一个 IObservable 用于所述属性,您可以利用标准 Rx 运算符将事件转换为 IObservable。你可以用谷歌搜索找到很多不同的实现。您通常会从正在观察视图模型的事物中创建和使用这些可观察对象,而不是直接在视图模型上公开它们。

    【讨论】:

    • 这可以在 Rx.NET 中工作,因为你有 INotifyPropertyChanged 但在 swift 中你没有(最接近的是 KVO,它只在 NSObject 子类上)。此外,我不确定我是否喜欢在某处公开 get/set、INotifyPropertyChanged 和 Observable 的想法——如果我正在制作视图模型,为什么我不直接使用可观察对象而不是混合事件系统。跨度>
    猜你喜欢
    • 2019-02-01
    • 2011-02-03
    • 1970-01-01
    • 2011-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-21
    • 1970-01-01
    相关资源
    最近更新 更多