iOS项目中尝试使用ViewModel<一>

ViewModel功能 1:  对网络请求操做进行封装统一处理。对ViewController进行瘦身。网络

1.咱们先来实现一个 tableview 列表,而后列表里的数据是经过网络请求去获取。atom

2.思考下,若是不用 ViewModel的时候,咱们的写法是 把网络请求的封装的get方法写到 ViewController 里面,而后去处理成功或者失败的回调方法。把数据源在ViewController里定义好,而且在回调里进行添加或者修改删除....操做处理。spa

例子:.net

[[YYWHttpClient shareInstanceClient] sendGetRequestWith:SEARCH_CAR parameter:parameter response:^(id JSONData, NSError *error, NSURLSessionDataTask *dataTask) {        索引

    }];rem

回调方法里可能会作一些:get

     a.对数据源进行操做的代码,it

        例如:下拉刷新的操做请求的话,在ViewModel里 直接对 原始数据进行所有删除,而后去加入新的返回过来的数据.io

        

if (operationType == RCarListRefreshTypeDropDown) {table

                [self.carSource removeAllObjects];

            }

            for (CarInfo *carInfo in carList) {

                [self.carSource addObject:carInfo];

            }

     b.在请求前能够会对参数进行一些验证,

        好比 你可能根据角色去请求不一样的网络请求,好比管理员可能要请求两个请求,而普通员工只用拿到一个请求。

        包括参数里 有哪些参数若是为 空或者 0的话 默认传什么参数...之前在VC里写的一些判断什么的均可以写在这里。

若是一个ViewController的请求过多的话,那么它自身的代码行数也会愈来愈多,并且管理修改起来也不是很方便,

因此这个时候 能够用 ViewModel来处理这一部分的功能。而且把数据源定义也能够用在ViewModel里去定义,在ViewController里 直接返回 self.viewModel.carSource.count 以及显示其中的内容。

3.好比作了 上拉加载更多,或者下拉刷新的操做,这个时候要去进行网络请求,咱们这个时候就能够直接

在ViewModel里定义一个方法,方法名字就是你当前所作的操做,好比:

- (void)refreshCarListWithOperation:(CarListRefreshType)operationType success:(void (^)(void))successBlock error:(void (^)(CarHTTPCode))errorBlock {}

在ViewController里就能够在 下拉刷新和加载的时候直接用 self.viewModel去调用这个方法,而后传入是刷新仍是加载更多的类型。当这个回调完成后,在里面进行ViewController里的刷新和加载更多控件的结束: [myRefresh endRefreshing]; 在viewModel里的方法里去作 网络请求和对数据源进行处理 还有就是要传的参数处理。

在ViewModel里 写一个 回调block ,去处理,当网络请求成功后  须要作的变动,好比单独删除/更新状态 某一条,所有刷新,.... 当ViewModel里的网络请求成功或者失败的时候 去作一些处理。例子:

/// 车辆列表数据源变动回调,携带变动的类型及索引(全量更新时索引不存在)

@property (nonatomic, copy) void(^CarListChanged)(RCarListChangedType type,  NSIndexPath * _Nullable indexPath);

而后ViewModel里网络请求失败或成功回调后加入下面这行代码, 根据须要来进行 调用这个block 传出去给vc须要的一些信息,

            self.carListChanged ? self.carListChanged(RCarListChangedTypeRefresh, indexPath) : nil

在ViewController的 viewmodel懒加载初始化的时候 写好 收到 block调用 回调里须要作什么:

 

 

[_viewModel setCarListChanged:^(CarListChangedType type, NSIndexPath * _Nullable index) {

            [weakSelf updateCarListWithType:type index:index];

        }];

- (void)updateCarListWithType:(CarListChangedType)type index:(NSIndexPath *)indexPath {

    if (type == CarRoomListChangedTypeReloadAll) {

        [self.carListView reloadData];

    } else if (type == CarRoomListChangedTypeRefresh) {

        [self.carListView reloadItemsAtIndexPaths:@[indexPath]];

    } else if (type == CarListChangedTypeDelete) {

        [self.carListView deleteItemsAtIndexPaths:@[indexPath]];

}

相关文章
相关标签/搜索