ViewModel創(chuàng)建RACCommand:
-(RACCommand *)command{
? ? if(!_command){
? ? ? ? _command =[[RACCommand alloc]initWithSignalBlock:^RACSignal * _Nonnull(id? _Nullable input){
? ? ? ? ? ? return[self signal];
? ? ? ? }];
? ? }
? ? return _command;
}
-(RACSignal *)signal{
? ? return[RACSignal createSignal:^RACDisposable * _Nullable(id? _Nonnull subscriber){
? ? ? ? [[RequestManager sharedManager]showHud:YES successBlock:^(NSDictionary *response){
? ? ? ? ? ? [subscriber sendNext:Model];
? ? ? ? ? ? [subscriber sendCompleted];
? ? ? ? } failureBlock:^(NSError *error){
? ? ? ? ? ? [subscriber sendError:error];
? ? ? ? ? ? [subscriber sendCompleted];
? ? ? ? }];
? ? ? ? return nil;
? ? }];
}
在View層調(diào)用Command:
?[self.viewModel.couponDetailCommand.executionSignals.switchToLatest subscribeNext:^(id? _Nullable x){
? ? ? ? [self showCouponDetailView];
? ? }error:^(NSError * _Nullable error){
? ? ? ? NSLog()
? ? }];
?[self.viewModel.couponDetailCommand execute:@1];
這種方式viewModel中sendError得話是收不到回調(diào)。
解決方案:
一陆爽、更改為:
? ? [[self.viewModel.couponDetailCommand execute:@{}]subscribeNext:^(id? _Nullable x){
? ? ? ? [self showCouponDetailView];
? ? }error:^(NSError * _Nullable error){
? ? ? ? [self showNormalView];
? ? }];
二翘单、使用Command的error信號
[self.viewModel.couponDetailCommand.executionSignals.switchToLatest subscribeNext:^(id? _Nullable x){
? ? ? ? //請求成功
? ? }];
?[self.viewModel.couponDetailCommand.errors subscribeNext:^(NSError * _Nullable x){
? ? ? ? //請求失敗
?}];
三撼短、使用materialize和dematerialize
materialize將所有的信號封裝成event一并回調(diào),但會導(dǎo)致Command對象中error、executing等信號無回調(diào),不建議使用
-(RACCommand *)couponDetailCommand{
? ? if(!_couponDetailCommand){
? ? ? ? _couponDetailCommand =[[RACCommand alloc]initWithSignalBlock:^RACSignal * _Nonnull(id? _Nullable input){
? ? ? ? ? ? return[[self signal]materialize];
? ? ? ? }];
? ? }
? ? return _couponDetailCommand;
}
[self.viewModel.couponDetailCommand.executionSignals subscribeNext:^(RACSignal *execution){
? ? ? ? [[[execution dematerialize]deliverOn:[RACScheduler mainThreadScheduler]]subscribeError:^(NSError *error){
? ? ? ? ? ? NSLog(@"發(fā)生錯(cuò)誤");
? ? ? ? } completed:^{
? ? ? ? ? ? NSLog(@"完成");
? ? ? ? }];
?}];