Ios 反应:订阅平坦映射信号的已完成事件
这是我的代码片段。问题是它没有到达subscribeCompleted块。当我在地图块内返回空信号时,它应该立即完成。不是吗Ios 反应:订阅平坦映射信号的已完成事件,ios,reactive-cocoa,frp,reactive-cocoa-3,Ios,Reactive Cocoa,Frp,Reactive Cocoa 3,这是我的代码片段。问题是它没有到达subscribeCompleted块。当我在地图块内返回空信号时,它应该立即完成。不是吗 RACObserve(self.object, "mobile").skip(2).doNext { (_) -> Void in self.tabBarController?.showHud("Updating Profile") }.flattenMap { (object) -> RACStream
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()
}
展平映射可以看作是将整个信号转化为一个空信号的集合,完成的信号将在每个空信号完成(展平映射的信号完成)之前不会发送。展平映射返回的信号将仅在“源”信号完成时完成。在您的情况下,将
flattmap
运算符应用于以下信号:
RACObserve(self.object,“mobile”)。跳过(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()
}
请注意,您甚至根本不需要
flattmap
。由于take
operator,信号将简单地完成。“只有当“源”信号完成时,Flattmap返回的信号才会完成”,这消除了我的疑虑。