iOSReactiveCocoa+MVVM

RACCommand响应结果解析

2016-04-01  本文已影响868人  longer冯

特别注意:定义的command中的封装信号一定要sendCompleted;否则在生命周期内无法被重新激活;

1. 普通的command

普通的RACCommand的使用很简单了,只需要在封装的信号中sendCompleted、sendError就可以。例如:

- (RACCommand *)commandForDataSelecting {
  if (!_commandForDataSelecting) {
    @weakify(self);
    _commandForDataSelecting = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) {
        return [[RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
            @strongify(self);
            [[DBManager sharedDB] selectDataFromTabel:kCardInfoTableName forConditions:nil sucBlock:^(NSArray *datasSelected) {
                [subscriber sendCompleted];
            } errBlock:^(NSError *error) {
                [subscriber sendError:error];
            }];
            return nil;
        }] replayLast];
    }];
  }
  return _commandForDataSelecting;
}

2. 获取响应状态

要处理的状态有3种:开始,完成,失败

实际测试发现,subscribeNext只能获取到 completed的状态,所以可以在 subscribeNext 前对结果进行过滤:filter:,过滤出completed的状态。

3. 疑惑和解惑

所以,我们要解决的目标:command 抛出 error 时,不要同时抛出 completed .

新的command定义和executionSignals处理如下:

// command定义
- (RACCommand *)commandForDataSelecting {
  if (!_commandForDataSelecting) {
    @weakify(self);
    _commandForDataSelecting = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) {
        return [[[[RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
            @strongify(self);
            [[DBManager sharedDB] selectDataFromTabel:kCardInfoTableName forConditions:nil sucBlock:^(NSArray *datasSelected) {
                self.cardInfosSelected = [datasSelected copy];
                [subscriber sendCompleted];
            } errBlock:^(NSError *error) {
                [subscriber sendError:error];
            }];
            return nil;
        }] replayLast] materialize] delay:1];
    }];
  }
  return _commandForDataSelecting;
}

 // 结果处理
 [command.executionSignals subscribeNext:^(RACSignal* signal) {
    @strongify(self);
    [[[signal dematerialize] deliverOn:[RACScheduler mainThreadScheduler]] subscribeError:^(NSError *error) {
        [self.progressHUD showFailWithText:[error localizedDescription] andDetailText:nil onCompletion:nil];
    } completed:^{
        [self.progressHUD showSuccessWithText:@"加载成功" andDetailText:nil onCompletion:^{}];
    }];
}];
上一篇 下一篇

猜你喜欢

热点阅读