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)

Другие вопросы по тегам