1

这是我的代码片段。问题是它没有达到 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()
            }
4

2 回答 2

2

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

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

RACObserve只有当正在观察的对象被释放时,才会完成返回的信号。根据您想要实现的目标,您可以使用一些运算符来转换信号并获得另一个更早完成的信号。

例如,您可以使用filterandtake使结果信号在发送匹配某些条件的第一个值后完成:

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操作员,信号将简单地完成。

于 2016-03-11T11:41:33.330 回答
0

flattenMap 可以看作是将整个信号变成一个空信号的 concat,直到每个空信号完成(被 flattenMapped 完成的信号)才发送完成

于 2016-03-11T10:53:06.767 回答