2016-03-09 52 views
2

我正在製作一個簡單的iOS應用程序來學習ReactiveCocoa。直到現在我一直在使用XIB文件,但決定切換到故事板。 在我的第一個視圖中,我有登錄屏幕,當用戶按下按鈕時,viewModel執行RACCommand來認證用戶並下載他的聯繫人列表。之後,我需要從ViewController調用performSegueWithIdentifier:來顯示下載的數據。如何在ViewController中通知viewModel成功完成其操作?ViewModel完成操作時在ViewController中的通知

下面是從視圖控制器代碼片段:

RAC(self.viewModel, username) = self.usernameTextField.rac_textSignal; 
RAC(self.viewModel, password) = self.passwordTextField.rac_textSignal; 
self.loginButton.rac_command = self.viewModel.executeSignin; 

,並從其視圖模型片段:

////////////////////////////////IN INIT//////////////////////////////////// 
self.executeSignin = 
    [[RACCommand alloc] initWithEnabled:validAuthenticateSignal 
          signalBlock:^RACSignal *(id input) { 
           return [self executeSigninSignal]; 
          }]; 
////////////////////////////////////////////////////////////////////////// 

-(RACSignal *)executpsigninsignal { 
    return [[[self.services getAuthenticationService] 
      authenticationSignalFor:self.username andPassword:self.password] 
      //Return user if exists 
      flattenMap:^RACStream *(STUser *user) { 
       return [[[[[self services] getContactsLoadService] 
       contactsLoadSignalForUser:user] deliverOn:[RACScheduler mainThreadScheduler]] 
       //Return user contacts 
       doNext:^(NSArray *contacts) { 
        _downloadedContacts = [NSArray arrayWithArray:contacts]; 
       }]; 

      }]; 
} 

我也試圖觀察的ViewController的ViewModels downloadedContacts屬性:

RACSignal *contactsLoadSignal = RACObserve(self.viewModel, downloadedContacts); 
[[contactsLoadSignal filter:^BOOL(NSArray *value) { 
    return value!=nil && value.count>0; 
}]subscribeNext:^(NSArray *array) { 
    [self performSegueWithIdentifier:@"pushContactsList" sender:self]; 
}]; 

但這似乎不起作用,並不真正看起來不錯。

回答

1

可以使用命令的executionSignals屬性來做到這一點:

@weakify(self) 
[executeSignin.executionSignals.switchToLatest filter:^BOOL(NSArray *value) { 
    return value.count>0; //nil check was redundant here 
}] subscribeNext:^(NSArray *array) { 
    @strongify(self) 
    [self performSegueWithIdentifier:@"pushContactsList" sender:self]; 
}]; 
相關問題