【发布时间】: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