2015-06-30 16 views
0

我有一個單身人士有財產KGTour * tour; 單身人士擁有一個RACReplaySubject * tourChangedSubject,如果它被設置,它將發送巡迴對象。反應可可:重播如果變得活躍

[mySingleton startTour:aNewTourObject]; 
在我單身的定製的setter

: - 初始化時 -

- (void)startTour:(KGTour *)tour { 
    [self.tourChangedSubject sendNext:tour]; 
} 

然後我有一個視圖模型是重播的最後旅程:

[[mySingleton.tourChangedSubject replayLast]] subscribeNext:^(id x) { 
    ... 
}]; 

可正常工作,一切都很好目前。

但是:我的目標是僅在我的viewModel處於活動狀態而另一個屬性設置爲true時才重播此漫遊。 所以我創建告訴我,當「準備就緒」(如果主動和isLoaded屬實)的信號:

self.isLoadedSignal = [RACObserve(self, isLoaded) 
    filter:^(NSNumber *loaded) { 
     return loaded.boolValue; 
    }]; 
self.isActiveSignal = [RACObserve(self, isActive) 
    filter:^(NSNumber *active) { 
     return active.boolValue; 
    }]; 

RACSignal *readySignal = [self.isActiveSignal 
    flattenMap:^RACStream *(id value) { 
     @strongify(self); 
     return self.mapIsLoadedSignal; 
    }]; 

視圖模型可以切換其工作狀態。 它再次活躍後,我想獲得最新的旅遊和做一些事情。

例如該viewModel活動幾秒鐘,現在它的活動標誌設置爲false。如果不活動,更新單身人士的導覽屬性(併發出tourChangedSubject)不應該打擾不活動的viewModel。但是如果viewModel再次激活,它應該重放上一次巡視以更新viewModel的一些UI。

我真的很喜歡RAC,但我有我的麻煩真的進入它,所以任何提示將不勝感激!

歡呼

回答

0

這將創建lastTourIfReadySignal如果視圖模型isLoadedisActive將發送的tourChangedSubject最新值。

RACSignal* isReadySignal = [[RACSignal combineLatest:@[RACObserve(self, isLoaded), 
                 RACObserve(self, isActive)]] 
          and]; 

RACSignal* lastTourIfReadySignal = [[[RACSignal combineLatest:@[mySingleton.tourChangedSubject, 
                   isReadySignal]] 
            filter:^BOOL(RACTuple* tuple) { 
             return [tuple.second boolValue]; 
            }] 
            map:^id(RACTuple* tuple) { 
             return tuple.first; 
            }]; 
+0

感謝,但lastTourIfReadySignal火災時立即tourChangedSubject發送旅遊(不可思議,但「tuple.second.boolValue」是真實的,雖然「積極」是NO)。 如果viewModel將其狀態更改爲active = YES(並且isLoaded = YES),我試圖重播上次巡視。活動可能會多次切換,而isLoaded只會更改一次(爲YES)。解釋這個案例不是很好,但希望你能理解這個用例... – kampfgnu

+0

只有當viewModel isActive和isLoaded時,lastTourIfReadySignal纔會觸發。如果它是不活動的,mySingleton得到一個新的KGTour對象,lastTourIfReadySignal應該在viewModel isActive之後再次觸發... – kampfgnu

+0

是的,我理解你的用例,我看不出爲什麼提議的解決方案不起作用。定義'isLoaded'和'isActive'? –