1. 程式人生 > >iOS MVVM+RAC 從框架到實戰

iOS MVVM+RAC 從框架到實戰

// // LSCircleListViewModel.m // ZhongShui // // Created by 王隆帥 on 16/3/10. // Copyright © 2016年 王隆帥. All rights reserved. // #import "LSCircleListViewModel.h" #import "LSCircleListCollectionCellViewModel.h" #import "LSCircleListModel.h" @interface LSCircleListViewModel () @property (nonatomic, assign) NSInteger
currentPage; @end @implementation LSCircleListViewModel - (void)yc_initialize { @weakify(self); [self.refreshDataCommand.executionSignals.switchToLatest subscribeNext:^(NSDictionary *dict) { @strongify(self); if (dict == nil) { [self.refreshEndSubject sendNext:@(LSRefreshError)]; ShowErrorStatus(@"網路連線失敗"
); return; } if ([dict[@"status"] integerValue] == 0) { self.listHeaderViewModel.dataArray = [[[([(NSDictionary *)dict[@"res"] arrayForKey:@"JoinCircles"]).rac_sequence map:^id(NSDictionary *dic) { LSCircleListModel *model = [LSCircleListModel mj_objectWithKeyValues:dic]; LSCircleListCollectionCellViewModel *viewModel = [[LSCircleListCollectionCellViewModel alloc] init]; viewModel.model
= model; return viewModel; }] array] mutableCopy]; self.dataArray = [[[([(NSDictionary *)dict[@"res"] arrayForKey:@"Circles"]).rac_sequence map:^id(NSDictionary *dic) { LSCircleListModel *model = [LSCircleListModel mj_objectWithKeyValues:dic]; LSCircleListCollectionCellViewModel *viewModel = [[LSCircleListCollectionCellViewModel alloc] init]; viewModel.model = model; return viewModel; }] array] mutableCopy]; [self ls_setHeaderRefreshWithArray:dict[@"Circles"]]; [self ls_dismiss]; } else { [self.refreshEndSubject sendNext:@(LSRefreshError)]; ShowMessage(dict[@"mes"]); } }]; [[[self.refreshDataCommand.executing skip:1] take:1] subscribeNext:^(id x) { @strongify(self); if ([x isEqualToNumber:@(YES)]) { [self ls_showWithStatus:@"正在載入"]; } }]; [self.nextPageCommand.executionSignals.switchToLatest subscribeNext:^(NSDictionary *dict) { @strongify(self); if (dict == nil) { [self.refreshEndSubject sendNext:@(LSRefreshError)]; ShowErrorStatus(@"網路連線失敗"); return; } if ([dict[@"status"] integerValue] == 0) { NSMutableArray *recommandArray = [[NSMutableArray alloc] initWithArray:self.dataArray]; for (NSDictionary *subDic in [(NSDictionary *)dict[@"res"] arrayForKey:@"Circles"]) { LSCircleListModel *model = [LSCircleListModel mj_objectWithKeyValues:subDic]; LSCircleListCollectionCellViewModel *viewModel = [[LSCircleListCollectionCellViewModel alloc] init]; viewModel.model = model; [recommandArray addObject:viewModel]; } self.dataArray = recommandArray; [self ls_setFootRefreshWithArray:dict[@"Circles"]]; [self ls_dismiss]; } else { [self.refreshEndSubject sendNext:@(LSRefreshError)]; ShowMessage(dict[@"mes"]); } }]; } #pragma mark - private - (NSMutableDictionary *)requestCircleListWithId:(NSString *)idStr currentPage:(NSString *)currentPage { idStr = IF_NULL_TO_STRING(idStr); currentPage = IF_NULL_TO_STRING(currentPage); NSMutableDictionary * dict = [@{@"MemberID": idStr, @"pageSize": LS_REQUEST_LIST_COUNT, @"pageIndex":currentPage} mutableCopy]; return dict; } - (void)ls_setFootRefreshWithArray:(NSArray *)array { if (array.count < LS_REQUEST_LIST_NUM_COUNT) { [self.refreshEndSubject sendNext:@(LSFooterRefresh_HasNoMoreData)]; } else { [self.refreshEndSubject sendNext:@(LSFooterRefresh_HasMoreData)]; } } - (void)ls_setHeaderRefreshWithArray:(NSArray *)array { if (array.count < LS_REQUEST_LIST_NUM_COUNT) { [self.refreshEndSubject sendNext:@(LSHeaderRefresh_HasNoMoreData)]; } else { [self.refreshEndSubject sendNext:@(LSHeaderRefresh_HasMoreData)]; } } #pragma mark - lazyLoad - (RACSubject *)refreshUI { if (!_refreshUI) { _refreshUI = [RACSubject subject]; } return _refreshUI; } - (RACSubject *)refreshEndSubject { if (!_refreshEndSubject) { _refreshEndSubject = [RACSubject subject]; } return _refreshEndSubject; } - (RACCommand *)refreshDataCommand { if (!_refreshDataCommand) { @weakify(self); _refreshDataCommand = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) { @strongify(self); return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) { @strongify(self); self.currentPage = 1; [self.request POST:LS_URL_CIRCLE_MEMBER_LIST parameters:[self requestCircleListWithId:@"1" currentPage:[NSString stringWithFormat:@"%d",self.currentPage]] success:^(CMRequest *request, NSString *responseString) { NSDictionary *dict = [responseString objectFromJSONString]; [subscriber sendNext:dict]; [subscriber sendCompleted]; } failure:^(CMRequest *request, NSError *error) { ShowErrorStatus(@"網路連線失敗"); [subscriber sendCompleted]; }]; return nil; }]; }]; } return _refreshDataCommand; } - (RACCommand *)nextPageCommand { if (!_nextPageCommand) { @weakify(self); _nextPageCommand = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) { @strongify(self); return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) { @strongify(self); self.currentPage ++; [self.request POST:LS_URL_CIRCLE_TOPIC_LIST parameters:nil success:^(CMRequest *request, NSString *responseString) { NSDictionary *dict = [responseString objectFromJSONString]; [subscriber sendNext:dict]; [subscriber sendCompleted]; } failure:^(CMRequest *request, NSError *error) { @strongify(self); self.currentPage --; ShowErrorStatus(@"網路連線失敗"); [subscriber sendCompleted]; }]; return nil; }]; }]; } return _nextPageCommand; } - (LSCircleListHeaderViewModel *)listHeaderViewModel { if (!_listHeaderViewModel) { _listHeaderViewModel = [[LSCircleListHeaderViewModel alloc] init]; _listHeaderViewModel.title = @"已加入的圈子"; _listHeaderViewModel.cellClickSubject = self.cellClickSubject; } return _listHeaderViewModel; } - (LSCircleListSectionHeaderViewModel *)sectionHeaderViewModel { if (!_sectionHeaderViewModel) { _sectionHeaderViewModel = [[LSCircleListSectionHeaderViewModel alloc] init]; _sectionHeaderViewModel.title = @"推薦圈子"; } return _sectionHeaderViewModel; } - (NSArray *)dataArray { if (!_dataArray) { _dataArray = [[NSArray alloc] init]; } return _dataArray; } - (RACSubject *)cellClickSubject { if (!_cellClickSubject) { _cellClickSubject = [RACSubject subject]; } return _cellClickSubject; } @end