ReactiveCocoa初体验

最近一个项目 尝试开始使用ReactiveCocoa. 项目结束了 简单记录下 项目中的应用.

Case 0.基本款 - subscribeNext 应用:VC中绑定viewModel里的error => 进行错误处理
@weakify(self);
[RACObserve(self.viewModel, error) subscribeNext:^(id x) {
        @strongify(self);
        if (self.viewModel.error) {
            [self showExceptionEmptyView:self.viewModel.error];
        }
    }];
Case 1.RAC&combineLatest&reduce 应用:关联登录页面中的登录按钮与用户名&密码框中输入的内容
RAC(self.sureBtn,enabled) = [RACSignal combineLatest:@[self.passWordTextField.rac_textSignal,
                                                       self.surePassWordTextField.rac_textSignal,
                                                       self.codeTextField.rac_textSignal
                                                      ]
                                               reduce:^(NSString *passWord, NSString *surePassWord, NSString *codeText){
                                                 BOOL enabled = (passWord.length > 0 && surePassWord.length > 0 && codeText.length > 0)? YES:NO;
                                                 self.sureBtn.backgroundColor = enabled ? [UIColor colorWithHex:0x008EFF]:[UIColor colorWithHex:0x797979];
                                                 return @(enabled);
                                               }];
Case 2.rac_command - UIControl's RAC Support Category. More convenient to write the action code of UIControls without delegate.
DDViolationInfoCell *cell = [tableView dequeueReusableCellWithIdentifier:NSStringFromClass([DDViolationInfoCell class])
                                                            forIndexPath:indexPath];

@weakify(self);
cell.showReasonBtn.rac_command = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input){
    @strongify(self);
    return [RACSignal defer:^RACSignal *(){
        // Btn Action
        return [RACSignal empty];
    }];
}];

@weakify(self);
    [self.lv2ItemPriceTextField.rac_textSignal subscribeNext:^(NSString *newText) {
        @strongify(self);
        NSString *tempStr = [NSString stringWithFormat:@"%0.2f", [newText floatValue]];
        self.lv2ItemModel.price = [tempStr floatValue];
    }];
Case 3.节流阀-throttle 应用:轮询请求
@weakify(self);
 self.violationInfoUpdatedSignal = [[RACObserve(self.viewModel, violationInfo) throttle:2.0] subscribeNext:^(id x) {
    @strongify(self);
    if (x) {
        if (4 == self.viewModel.violationInfo.code && self.viewModel.violationInfoCheckTimes < 10) {    // 如果是正在查询中的状态 间隔2秒 发起一次请求
            self.viewModel.violationInfoCheckTimes ++;
            [self.viewModel requestViolationInfoWithVehicle:self.viewModel.violationBasicInfo.vehicle
                                                        ein:self.viewModel.violationBasicInfo.ein
                                                        vin:self.viewModel.violationBasicInfo.vin
                                                      areas:self.viewModel.violationBasicInfo.areas];
        } else if (self.viewModel.isShowViolationCarInfoErrorPage) {   // 展示车辆信息错误页面
            [self showExceptionEmptyView:nil];
        } else {  // 查询没有错误 & 查询不处于查询中的状态    
    }
}];
// 终止信号
[self.violationInfoUpdatedSignal dispose];

你可能感兴趣的:(ReactiveCocoa初体验)