RAC兩個方法map和flattenMap區別
flattenMap方法通過呼叫block(value)來建立一個新的方法,它可以靈活的定義新建立的訊號。
map方法,將會建立一個和原來一模一樣的訊號,只不過新的訊號傳遞的值變為了block(value)。
map建立一個新的訊號,訊號的value是block(value),也就是說,如果block(value)是一個訊號,那麼就是訊號的value仍然是訊號。如果是flattenMap則會繼續呼叫這個訊號的value,作為新的訊號的value。
- (RACSignal *)signInSignal { return [RACSignal createSignal:^RACDisposable *(id subscriber){ [self.signInService signInWithUsername:self.usernameTextField.text password:self.passwordTextField.text complete:^(BOOL success){ [subscriber sendNext:@(success)]; [subscriber sendCompleted]; }]; return nil; }]; }
[[[self.signInButton rac_signalForControlEvents:UIControlEventTouchUpInside] map:^id(id x){ return [self signInSignal]; }] subscribeNext:^(id x){ NSLog(@"Sign in result: %@", x); }];
這裡使用map的話,新的訊號value是(RACSignal *),我們需要的是這個訊號的值,所以這裡呼叫flattenMap,建立新的訊號,使用(RACSignal *)的value作為新訊號的value,也就是我們需要的值。
補充:
map 與 swtichToLatest結合類似於flattenMap
switchToLatest:選擇最新的訊號的Block(value),比如我依次傳送3個signal,但是switchToLatest只取第三個實現。
RACCommand兩個屬性:
RACCommand的executionSignals屬性,是signal of signals,如果直接subscribe的話會得到一個signal,而不是我們想要的value,所以一般會配合switchToLatest
RACCommand的executing屬性,它是一個訊號,傳送true或false來標明命令開始與結束執行的時間。
example1:命令執行的時候狀態列網路會顯示
RAC([UIApplication sharedApplication], networkActivityIndicatorVisible) = self.viewModel.executeSearch.executing;
example2:命令執行時,隱藏載入indicator
RAC(self.loadingIndicator, hidden) = [self.viewModel.executeSearch.executing not];