我習慣于用viewModel做數據層

好處:數據與VC層獨立開來捻悯,結構清晰男旗,方便處理球散;
缺點:一個VC對應一個viewModel


  • 創(chuàng)建BaseViewModel基類
  1. block作為回調
typedef void(^QYRequestCompletedBlock)(BOOL success,NSString *error,BOOL hasMoreData,BOOL isBlank);
success:請求成功與否巨缘;
error:錯誤提示添忘;
hasMoreData:能否上拉加載更多;
isBlank:數據是否為空若锁;

typedef void(^QYCacheCompletedBlock)(BOOL success,NSString *error);
success:數據是否為空搁骑;
  1. 通用數據的定義
//vc直接讀取dataArray
@property (nonatomic, strong) NSMutableArray *dataArray;

//true = 刷新; false = 加載更多
@property (nonatomic, assign) BOOL refresh;

///分頁
@property (nonatomic, assign) NSInteger pageIndex;
@property (nonatomic, assign) NSInteger pageSize;
  1. 實現方法,改變的是pageIndex
- (void)loadLastestPage;//刷新pageIndex=0
- (void)loadNextPage;//加載下一頁pageIndex++
//子類實現具體請求
- (void)loadItemsWithPageNum:(NSInteger)pageNum;
  1. 緩存的讀取
-(void)getCacheDataWithPath:(NSString*)fileName {
    NSArray *array = [QYFileManager readArrayWithFileName:fileName];
    
    [self.dataArray addObjectsFromArray:array];
    
    !self.cacheCompletedBlock ?: self.cacheCompletedBlock(self.dataArray.count>0,nil);
}
  • 創(chuàng)建繼承BaseViewModel的viewModel

具體的請求具體而論仲器,可以添加篩選條件煤率;

  • 具體方法
- (void)loadItemsWithPageNum:(NSInteger)pageNum {
    [super loadItemsWithPageNum:pageNum];
    
    kWeakSelf(self);
    [[QYNetManager sharedInstance] loadDataWithParameters:@{@"method":@"info",@"short_conn":@(0)} path:@"api/v1/vpan" methodType:QYRequestType_POST success:^(id responseObject) {
        kStrongSelf(self);
        
        if (pageNum == 0) {
            self.dataArray = nil;//初始化、忽略緩存
        }
        //TODO:數據的處理
        BOOL hasMoreData = true;//是否數據加載完畢
        
        //data...
        
        if (pageNum == 0) {
            //第一頁數據緩存
            
            dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),^{
                
                [QYFileManager saveArrayWithPath:self.dataArray fileName:@""];
            });
        }
        
        !self.requestCompletedBlock ?: self.requestCompletedBlock(true,nil,hasMoreData,self.dataArray.count>0);
    } failure:^(NSString *errorInfo) {
        kStrongSelf(self);
        
        !self.requestCompletedBlock ?: self.requestCompletedBlock(false,errorInfo,false,false);
    }];
    
}
  • VC調用

一個get方法

- (ViewControllerViewModel *)viewModel {
    if (!_viewModel) {
        _viewModel = [[ViewControllerViewModel alloc] init];
        
        __block ViewControllerViewModel *temp_viewModel = _viewModel;
        kWeakSelf(self);
        _viewModel.requestCompletedBlock = ^(BOOL success,NSString *error,BOOL hasMoreData,BOOL isBlank) {
            kStrongSelf(self);
            
            [self.tableView.mj_header endRefreshing];
            [self.tableView.mj_footer endRefreshing];
            
            if (success) {
                
                if (!hasMoreData) {//是否有更多數據
                    [self.tableView.mj_footer endRefreshingWithNoMoreData];
                }
                
                if (isBlank) {
                    //數據為空
                    //TODO:添加缺省頁面
                }else {
                    if (temp_viewModel.refresh) {
                        //下拉上拉刷新
                    }else {
                        //上拉刷新
                    }
                }
            }else {
                //TODO:給出錯誤提示
            }
        };
        
        _viewModel.cacheCompletedBlock = ^(BOOL success,NSString *error) {
            //緩存
        };
        
    }
    return _viewModel;
}

注意的是每次下拉刷新的時候手動設置viewModel的refresh為YES

Demo

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末乏冀,一起剝皮案震驚了整個濱河市蝶糯,隨后出現的幾起案子,更是在濱河造成了極大的恐慌辆沦,老刑警劉巖昼捍,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異肢扯,居然都是意外死亡妒茬,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門蔚晨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來乍钻,“玉大人,你說我怎么就攤上這事蛛株⊥帕蓿” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵谨履,是天一觀的道長欢摄。 經常有香客問我,道長笋粟,這世上最難降的妖魔是什么怀挠? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮害捕,結果婚禮上绿淋,老公的妹妹穿的比我還像新娘。我一直安慰自己尝盼,他們只是感情好吞滞,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著盾沫,像睡著了一般裁赠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上赴精,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天佩捞,我揣著相機與錄音,去河邊找鬼蕾哟。 笑死一忱,一個胖子當著我的面吹牛莲蜘,可吹牛的內容都是我干的。 我是一名探鬼主播帘营,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼票渠,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了芬迄?” 一聲冷哼從身側響起庄新,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎薯鼠,沒想到半個月后择诈,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡出皇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年羞芍,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片郊艘。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡荷科,死狀恐怖,靈堂內的尸體忽然破棺而出纱注,到底是詐尸還是另有隱情畏浆,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布狞贱,位于F島的核電站刻获,受9級特大地震影響,放射性物質發(fā)生泄漏瞎嬉。R本人自食惡果不足惜蝎毡,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望氧枣。 院中可真熱鬧沐兵,春花似錦、人聲如沸便监。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽烧董。三九已至毁靶,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間解藻,已是汗流浹背老充。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工葡盗, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留螟左,地道東北人啡浊。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像胶背,于是被迫代替她去往敵國和親巷嚣。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內容

  • iOS網絡架構討論梳理整理中钳吟。廷粒。。 其實如果沒有APIManager這一層是沒法使用delegate的红且,畢竟多個單...
    yhtang閱讀 5,165評論 1 23
  • 發(fā)現 關注 消息 iOS 第三方庫坝茎、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,033評論 4 62
  • 2017.02.22 可以練習暇番,每當這個時候嗤放,腦袋就犯困,我這腦袋真是神奇呀壁酬,一說讓你做事情次酌,你就犯困,你可不要太...
    Carden閱讀 1,328評論 0 1
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理舆乔,服務發(fā)現岳服,斷路器,智...
    卡卡羅2017閱讀 134,601評論 18 139
  • 馮粒粒那邊已經熱火朝天希俩,兩人不知是誰摟著誰吊宋。小東攙著她離開時,也虧她還記得還有個姐妹在這兒颜武,對齊飛晃晃手贫母,“哎帥哥...
    阿斤a閱讀 198評論 0 0