ReactiveCocoa订阅已完成的flattenmaped信号事件

时间:2016-03-11 10:35:17

标签: ios reactive-cocoa frp reactive-cocoa-3

这是我的代码段。问题是它没有达到subscribeCompleted块。当我在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 个答案:

答案 0 :(得分:2)

flattenMap返回的信号仅在“源”信号完成时才会完成。在您的情况下,您将flattenMap运算符应用于以下信号:

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

RACObserve返回的信号仅在被观察对象解除分配时才会完成。根据您想要实现的目标,您可以使用一些运算符来转换信号并获得另一个先前完成的信号。

例如,您可以使用filtertake,以便在发送符合某些条件的第一个值后生成的信号完成:

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运算符,信号将完成。

答案 1 :(得分:0)

flattenMap可以看作是将整个信号转换为空信号的连续状态,完成后不会被发送,直到每个空信号完成(信号被flattenMapped完成)