2016-03-11 15 views
1

Это мой фрагмент кода. Проблема в том, что он не достигает подписки. Он должен немедленно завершить, когда я возвращаю пустой сигнал внутри блока flattenmap. Не так ли?ReactiveCocoa подписывается на завершенное событие с плоскими картами

RACObserve(self.object, "mobile").skip(2).doNext { (_) -> Void in 
       self.tabBarController?.showHud("Updating Profile") 
      }.flattenMap { (object) -> RACStream! in 
       return RACSignal.empty() 
      }.subscribeCompleted {() -> Void in 
       log.error("Completed") 
       self.tabBarController?.hideHud() 
      } 

ответ

2

Сигнал , возвращаемый flattenMap, будет завершен только после завершения «источника». В вашем случае применить flattenMap оператор к следующему сигналу:

RACObserve(self.object, "mobile").skip(2)

Сигнал, возвращаемый RACObserve завершается только тогда, когда наблюдаемый объект освобождается. В зависимости от того, что вы хотите достичь, вы можете использовать некоторые операторы для преобразования сигнала и получения другого, который будет завершен ранее.

Например, вы можете использовать filter и take таким образом, чтобы результирующий сигнал завершается после отправки его первое значение, соответствующее некоторым условиям:

RACObserve(self.object, "mobile").skip(2).doNext { (_) -> Void in 
        self.tabBarController?.showHud("Updating Profile") 
}.filter { 
//some filtering for the value of self.object.mobile 
    return $0.checkSomeConditions() 
}.take(1) 
.subscribeCompleted {() -> Void in 
     log.error("Completed") 
     self.tabBarController?.hideHud() 
} 

Обратите внимание, что вы даже не нужно flattenMap вообще. Сигнал будет просто завершен из-за оператора take.

+0

«Сигнал, возвращаемый функцией flattenMap, будет завершен только тогда, когда сигнал« источника »завершается« Это очищает мои сомнения. –

0

flattenMap можно рассматривать как превращение всего сигнала в CONCAT пустых сигналов, который завершается не будет отправлен, пока не завершит каждый пустой сигнал (сигнал, flattenMapped завершается)