如何用RxSwift观察Bool属性?

时间:2016-05-30 12:28:55

标签: ios swift rx-swift

我的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属性后执行此代码,我该怎么办?

2 个答案:

答案 0 :(得分:6)

请勿使用Index time ---------- document 1 name: Ayse --analysis--> Ayse document 2 name: Ayşe --analysis--> Ayşe, Ayse Query time ----------- query_string query input: Ayşe --analysis--> Ayşe, Ayse search for documents with tokens for name field matching Ayşe or Ayse class Message < ActiveRecord::Base has_attached_file :asset, styles: {thumb: "100x100#"} before_post_process :skip_for_audio def skip_for_audio ! %w(audio/ogg application/ogg).include?(asset_content_type) end end 。相反,请使用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 //... 依赖于符合KVO的属性。如果您在属性定义前使用了rx_observe关键字,则可以使用rx_observe。但是,您应该使用dynamic,例如dynamic var isRecording = false。查看Subject回购中涉及Variable的操场页面。它给出了每种类型的一个例子。

答案 1 :(得分:0)

使用最新的 RxSwift 5.0+,您可以使用 BehaviorRelay

let isLoading = BehaviorRelay<Bool>(value: false)

你可以观察到它的价值如下:

isLoading.asObservable().subscribe { status in
                print(status)
            }.disposed(by: disposeBag)