如何用RxSwift观察Bool属性?

Mar*_*ina 2 ios swift rx-swift

我的VC.swift中有两个Bool属性:

var isRecording = false
var isPlaying = false
Run Code Online (Sandbox Code Playgroud)

在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())
Run Code Online (Sandbox Code Playgroud)

addSubscription(:_)函数添加了对DisposableBag的订阅.问题是闭包中的代码只能工作一次.当属性"isRecording"和"isPlaying"发生变化时,它不起作用.如果我希望在更改这些bool属性后执行此代码,我该怎么办?

sol*_*ell 7

不要使用Boolrx_observe.相反,使用SubjectVariable<Bool>.

let isRecording = Variable(false)
let isPlaying = Variable(false)

let observable = Observable.combineLatest(isRecording.asObservable(), isPlaying.asObservable()) { (val1, val2) -> Void in
    //...
Run Code Online (Sandbox Code Playgroud)

但是,要回答您的问题,为什么它不起作用rx_observe,这是因为rx_observe依赖于属性符合KVO.如果您dynamic在属性定义前面使用了关键字,那么它将起作用:dynamic var isRecording = false.但是,你真的应该使用SubjectVariable.查看处理回购中Subjects 的操场页面RxSwift.它给出了每种类型的一个例子.