ReactiveCocoa 订阅 flattenmaped 信号的完成事件

ReactiveCocoa subscribe to completed event of flattenmaped signal

这是我的代码片段。问题是它没有到​​达 subscribeCompleted 块。它应该立即完成,因为我 return 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()
            }

flattenMap可以看作是把整个信号变成空信号的concat,完成后会等到每个空信号都完成(被flattenMapped的信号完成)后才会发送

flattenMap返回的信号只有在"source"信号完成时才会完成。在您的情况下,您将 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 [=10=].checkSomeConditions() 
}.take(1)
.subscribeCompleted { () -> Void in
        log.error("Completed")
        self.tabBarController?.hideHud()
}

请注意,您甚至根本不需要 flattenMap。由于 take 运算符,信号将简单地完成。