如何使用 RxSwift 观察 Bool 属性?
How to observe Bool properties with RxSwift?
我的 VC.swift 中有两个 Bool 属性:
var isRecording = false
var isPlaying = false
在 viewDidLoad() 方法中我有这样的代码:
let observable = Observable.combineLatest(self.rx_observe(Bool.self, "isRecording"), self.rx_observe(Bool.self, "isPlaying")) { (val1, val2) -> Void in
if(val1 == false && val2 == false){
self.recordButton.enabled = true
self.playButton.enabled = true
self.recordButton.setImage(UIImage(named: "record"), forState: UIControlState.Normal)
self.playButton.setImage(UIImage(named: "play"), forState: UIControlState.Normal)
} else if(val1 == true && val2 == false){
self.recordButton.enabled = true
self.recordButton.setImage(UIImage(named: "stop"), forState: UIControlState.Normal)
self.playButton.enabled = false
} else if(val1 == false && val2 == true){
self.recordButton.enabled = false
self.playButton.enabled = true
self.playButton.setImage(UIImage(named: "stop"), forState: UIControlState.Normal)
self.recordButton.setImage(UIImage(named: "record"), forState: UIControlState.Normal)
}
}.observeOn(MainScheduler.instance)
addSubscription(observable.subscribe())
函数 addSubscription(:_) 添加对 DisposableBag 的订阅。
问题是闭包中的代码只工作一次。它在属性 "isRecording" 和 "isPlaying" 更改时不起作用。如果我想在更改这些 bool 属性后执行此代码,该怎么办?
不要使用 Bool
和 rx_observe
。相反,使用 Subject
例如 Variable<Bool>
.
let isRecording = Variable(false)
let isPlaying = Variable(false)
let observable = Observable.combineLatest(isRecording.asObservable(), isPlaying.asObservable()) { (val1, val2) -> Void in
//...
但是,要回答您关于为什么它不适用于 rx_observe
的问题,这是因为 rx_observe
依赖于 属性 与 KVO 兼容。如果您在 属性 定义前使用 dynamic
关键字,它会起作用:dynamic var isRecording = false
。但是,您实际上应该使用 Subject
,例如 Variable
。查看处理 RxSwift
存储库中 Subject
的游乐场页面。它给出了每种类型的示例。
使用最新的 RxSwift 5.0+,您可以使用 BehaviorRelay
let isLoading = BehaviorRelay<Bool>(value: false)
你可以观察到它的值如下:
isLoading.asObservable().subscribe { status in
print(status)
}.disposed(by: disposeBag)
我的 VC.swift 中有两个 Bool 属性:
var isRecording = false
var isPlaying = false
在 viewDidLoad() 方法中我有这样的代码:
let observable = Observable.combineLatest(self.rx_observe(Bool.self, "isRecording"), self.rx_observe(Bool.self, "isPlaying")) { (val1, val2) -> Void in
if(val1 == false && val2 == false){
self.recordButton.enabled = true
self.playButton.enabled = true
self.recordButton.setImage(UIImage(named: "record"), forState: UIControlState.Normal)
self.playButton.setImage(UIImage(named: "play"), forState: UIControlState.Normal)
} else if(val1 == true && val2 == false){
self.recordButton.enabled = true
self.recordButton.setImage(UIImage(named: "stop"), forState: UIControlState.Normal)
self.playButton.enabled = false
} else if(val1 == false && val2 == true){
self.recordButton.enabled = false
self.playButton.enabled = true
self.playButton.setImage(UIImage(named: "stop"), forState: UIControlState.Normal)
self.recordButton.setImage(UIImage(named: "record"), forState: UIControlState.Normal)
}
}.observeOn(MainScheduler.instance)
addSubscription(observable.subscribe())
函数 addSubscription(:_) 添加对 DisposableBag 的订阅。 问题是闭包中的代码只工作一次。它在属性 "isRecording" 和 "isPlaying" 更改时不起作用。如果我想在更改这些 bool 属性后执行此代码,该怎么办?
不要使用 Bool
和 rx_observe
。相反,使用 Subject
例如 Variable<Bool>
.
let isRecording = Variable(false)
let isPlaying = Variable(false)
let observable = Observable.combineLatest(isRecording.asObservable(), isPlaying.asObservable()) { (val1, val2) -> Void in
//...
但是,要回答您关于为什么它不适用于 rx_observe
的问题,这是因为 rx_observe
依赖于 属性 与 KVO 兼容。如果您在 属性 定义前使用 dynamic
关键字,它会起作用:dynamic var isRecording = false
。但是,您实际上应该使用 Subject
,例如 Variable
。查看处理 RxSwift
存储库中 Subject
的游乐场页面。它给出了每种类型的示例。
使用最新的 RxSwift 5.0+,您可以使用 BehaviorRelay
let isLoading = BehaviorRelay<Bool>(value: false)
你可以观察到它的值如下:
isLoading.asObservable().subscribe { status in
print(status)
}.disposed(by: disposeBag)