2016-03-11 18 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完成)