牛叉的demoiOS函数式编程iOS头条干货

ReactiveCocoa用法示例(一)

2017-11-13  本文已影响24人  贺彦文

知识点

界面如下

RACComand与TableView刷新事件绑定

// UITableView+RACCommandSupport.m 文件中代码
- (void)setRac_Refreshcommand:(RACCommand *)command {
    objc_setAssociatedObject(self, UITableViewRACRefreshCommandKey, command, OBJC_ASSOCIATION_RETAIN_NONATOMIC);

    if (command == nil) return;
    __weak typeof(self) weakSelf = self;
    self.mj_header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{
        __strong typeof(self) self = weakSelf;
        [command execute:self];
    }];
}

这里的分类主要就是给Tableview增加MJRefresh,并且将传入command参数传入MJRefresh执行的block中

//CCOrderViewModel.m 文件中代码
    NSArray *array = @[
                       @{@"time":@"今天 17:00",@"startAddress":@"浙江吉利控股集团有限公司",@"endAddress":@"瑞立东方花城",@"billPrice":@241.00},
                       @{@"time":@"今天 17:00",@"startAddress":@"浙江吉利控股集团有限公司",@"endAddress":@"杭州滨江区星光大道",@"billPrice":@21.00},
                       @{@"time":@"今天 17:00",@"startAddress":@"浙江吉利控股集团有限公司",@"endAddress":@"杭杭州萧山国际机场",@"billPrice":@10.00},
                       @{@"time":@"今天 17:00",@"startAddress":@"浙江吉利控股集团有限公司",@"endAddress":@"红石中央大厦",@"billPrice":@19.24},
                       @{@"time":@"今天 17:00",@"startAddress":@"浙江吉利控股集团有限公司",@"endAddress":@"杭州半山国家森林公园",@"billPrice":@2.00},
                       @{@"time":@"今天 17:00",@"startAddress":@"浙江吉利控股集团有限公司",@"endAddress":@"瑞立东方花城",@"billPrice":@15.00},
                       @{@"time":@"今天 17:00",@"startAddress":@"浙江吉利控股集团有限公司",@"endAddress":@"瑞立东方花城",@"billPrice":@241.00},];
    NSMutableArray *modelArray = [NSMutableArray array];
    [array enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        [modelArray addObject:[CCOrderModel orderWith:obj]];
    }];
    @weakify(self);
    self.refreashCmd = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) {
        return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
            @strongify(self);
            [self.orderArray removeAllObjects];
            [self.orderArray addObjectsFromArray:modelArray];
            [subscriber sendNext:self.orderArray];
            [subscriber sendCompleted];
            return nil;
        }];
    }];
    
    self.loadMoreCmd = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) {
        return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
            @strongify(self);
            [self.orderArray addObjectsFromArray:modelArray];
            [subscriber sendNext:self.orderArray];
            [subscriber sendCompleted];
            return nil;
        }];
    }];

这里定义两个command,将数据包在signal中,再包在command中

    // ViewController.m 文件中代码 command绑定
    self.tableView.rac_Refreshcommand = self.viewModel.refreashCmd;
    self.tableView.rac_Dropcommand = self.viewModel.loadMoreCmd;
  //CCOrderViewModel.m 文件中代码
    RACSignal *refreshEndSignal = [[self.refreashCmd executionSignals] switchToLatest];
    RACSignal *loadmoreEndSignal = [[self.loadMoreCmd executionSignals] switchToLatest];
    // 上拉和下拉两个信号统一输出
    self.reloadTableViewSignal = [RACSignal merge:@[refreshEndSignal, loadmoreEndSignal]];
    // ViewController.m 文件中代码
    [self rac_liftSelector:@selector(reloadTableView:) withSignals:self.viewModel.reloadTableViewSignal, nil];

/** 刷新列表 */
- (void)reloadTableView:(id)obj {
    [self.tableView.mj_header endRefreshing];
    [self.tableView.mj_footer endRefreshing];
    [self.tableView reloadData];
    NSString *numberString = self.viewModel.selectedOrders.first;
    NSString *priceString = self.viewModel.selectedOrders.second;
    BOOL enable = [self.viewModel.selectedOrders.third boolValue];
    self.bottomView.totalPriceLabel.text = priceString;
    self.bottomView.totalTravelLabel.text = numberString;
    [self.bottomView subviewEnable:enable];
}
上一篇下一篇

猜你喜欢

热点阅读