ReactiveCocoa подписаться на завершенное событие сигнала flattenmaped
Это мой фрагмент кода. Проблема в том, что он не достигает блока подписки. Предполагается, что он сразу же завершится, когда я верну пустой сигнал внутри блока flattenmap. Не так ли?
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
оператор.
FlattenMap можно рассматривать как преобразование всего сигнала в конкатенацию пустых сигналов, которая завершена, и не будет отправлена до тех пор, пока не завершится каждый пустой сигнал (завершается сигнал flattenMapped)