Latest 0.2.2
Homepage https://github.com/drinking/DKViewModel
License MIT
Platforms ios 8.0
Dependencies ReactiveObjC
Authors

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, [email protected]

License

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

Latest podspec

{
    "name": "DKViewModel",
    "version": "0.2.2",
    "summary": "A ViewModel implementation",
    "description": "TODO: Add long description of the pod here.",
    "homepage": "https://github.com/drinking/DKViewModel",
    "license": {
        "type": "MIT",
        "file": "LICENSE"
    },
    "authors": {
        "drinking": "[email protected]"
    },
    "source": {
        "git": "https://github.com/drinking/DKViewModel.git",
        "tag": "0.2.2"
    },
    "platforms": {
        "ios": "8.0"
    },
    "source_files": "DKViewModel/Classes/**/*",
    "dependencies": {
        "ReactiveObjC": []
    },
    "subspecs": [
        {
            "name": "IGListKit",
            "dependencies": {
                "IGListKit": [
                    "~> 3.0"
                ]
            }
        }
    ]
}

Pin It on Pinterest

Share This