2016-03-11 20 views
1

这是我的代码片段。问题是它没有达到subscribeCompleted块。它应该立即完成,因为我在flattenmap块中返回空信号。不是吗?ReactiveCocoa订阅flattenmaped信号的完成事件

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返回的信号,只有当被观察对象被释放完成。根据您想要达到的目标,您可以使用一些运算符来转换信号,并获得另一个可以提前完成的信号。

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都:

例如,可以使发送的第一个值相匹配的一些情况后,所产生的信号完成使用filtertake。该信号将由于take运营商而简单完成。

+0

“flattenMap返回的信号只有当”源“信号完成时才会完成”清除我的疑惑。 –

0

的flattenMap可以被看作是旋转整个信号转换成空信号的concat,则其在完成直到每个空信号完成将不被发送(该信号flattenMapped完成)