2016-05-30 4 views
1

У меня есть два свойства BOOL в моем VC.swift:Как наблюдать свойства Bool с помощью RxSwift?

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?

+0

Изменение этих свойств при изменении статуса, я подразумеваю, что воспроизведение или запись закончится и начнется снова. Вы реализовали его в viewdidload, поэтому он вызывается только один раз, когда он загружается. – Lion

ответ

2

Не использовать 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. Просмотрите страницу игровой площадки, посвященную Subject s в репозитории RxSwift. Это пример каждого типа.

+0

Спасибо, очень. Оно работает. Но я использовал это: let observable = Observable.combineLatest (isRecording.asObservable(), isPlaying.asObservable()) {(val1, val2) -> Пустота в // ... – Marina

+0

Ах спасибо за улов. Я обновил ответ. Я также добавил объяснение, почему он раньше не работал на вас. – solidcell

Смежные вопросы