DKViewModel 0.2.2

DKViewModel 0.2.2

测试已测试
语言语言 Obj-CObjective C
许可证 MIT
发布最新发布2018年7月

Drinking pan维护。



  • drinking

DKViewModel

CI Status Version License Platform

M-V-VM 中的 VM

DKViewModel是通过 ReactiveObjc 框架(原 ReactiveCocoa)实现 MVVM 思想中的 ViewModel 层。其中DKListViewModel封装了 iOS 中 UITableView 的常见状态和行为,是一个典型的 VM 实现。

状态变更

DKRequestStatus定义了列表的常见状态,通常为网络请求的状态。分别对应枚举请求未开始加载完成请求出错

通过订阅来响应状态的变化。其中请求未开始请求出错的常见做法是展示相应的占位图。当接收到加载完成没有更多数据状态时,ViewModel中的listData已经完成填充列表数据,只需要reloadData即可完成列表cell的更新。dataLoaded提供了详细的数组变化情况,可以针对列表做局部变化,无需reload所有。

     @weakify(self)
    [viewModel subscribePrePorgress:^{
        @strongify(self)
        [self.tableView.mj_header endRefreshing];
        [self.tableView.mj_footer endRefreshing];
    } notStarted:^{
        @strongify(self)
        [self updateTableViewStatusText:@"Request not started"];
    } dataLoaded:^(NSArray *list, NSArray *pathsToDelete, NSArray *pathsToInsert, NSArray *pathsToMove, NSArray *destinationPaths) {
        @strongify(self)
        self.tableView.tableFooterView.frame = CGRectZero;
        [self.tableView reloadData];
    } error:^(NSError *error) {
        @strongify(self)
        [self updateTableViewStatusText:@"Request Error!"];
    }];

也可以使用简化版本,进行最基础的列表需求。

[viewModel subscribeDataLoaded:^(NSArray *list) {
    do somthing 
} error:^(NSError *error) {
    do somthing        
}]

下拉刷新和加载更多

DKListViewModel内部定义了pageNumperPage用来标示当前加载的页码和每页加载的数据量,与框架MJRefresh配合使用,可以方便地实现pageNum的自增和复原。

self.tableView.mj_header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{
        [self.tableViewModel refresh];
    }];
    
self.tableView.mj_footer = [MJRefreshAutoNormalFooter footerWithRefreshingBlock:^{
        [self.tableViewModel nextPage];
    }];

构建TableViewModel

通过Block构造网络请求和数据处理,可以构建VM实例,满足大部分需求。pageOffset表示当前已请求数据偏移量,以便后端确定从何处返回新的数据。最后将处理好的数据和是否还有更多数据的BOOL变量,一起以Tuple形式返回给ViewModel实例,使其可以进行下一步状态更新操作。

[DKListViewModel instanceWithRequestBlock:^(DKListViewModel *instance,
            id <RACSubscriber> subscriber, NSInteger pageOffset) {  
	  //request data by pageOffset
  	  //transport result as Tuple (NSArray, @(BOOL) to ViewModel 
      [subscriber sendNext:RACTuplePack(array, @(hasMore))];            
}];
	

对于更复杂的ViewModel,可以通过继承进行定制。

安装

DKViewModel可通过CocoaPods获取。要安装,只需在Podfile中添加以下行

pod "DKViewModel"

作者

drinking, [email protected]

许可证

DKViewModel遵循MIT许可证。有关更多信息,请参阅LICENSE文件。