因為是單向的資訊流,在每次更新資訊時都是用 .accept
送出最近資訊,所以最好的做法是如果本身的資訊是組合性的 struct 則拆開成數個 BehaviorRelay 各別更新會比較好,這樣綁定在不同的 UIView 元件會比較好處理。
例如本來是長這樣:
struct Info {
var propertyA: Bool = false
var propertyB: Bool = false
var propertyC: Bool = false
}
就拆成三個 property 各自維護:
let propertyA = BehaviorRelay<Bool>(value: false)
let propertyB = BehaviorRelay<Bool>(value: false)
let propertyC = BehaviorRelay<Bool>(value: false)
然後就可以在 ViewController 層各別 Driver 綁定;
在最後如果需要組合判斷時才在用 Observable.combineLatest
來處理,例如:
var isEnable: Driver<Bool> {
return Observable.combineLatest(propertyA, propertyB, propertyC)
.map { $0 && $1 && $2 }
.asDriver(onErrorJustReturn: false)
}
這樣就可以做到資訊分流,最終統一控管的效果。