A ViewModel implementation


License
MIT
Install
pod try DKViewModel

Documentation

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通过继承来定制就可以了。

Installation

DKViewModel is available through CocoaPods. To install it, simply add the following line to your Podfile:

pod "DKViewModel"

Author

drinking, pan49@126.com

License

DKViewModel is available under the MIT license. See the LICENSE file for more info.