【iOS開發(fā)】淺談iOS列表分頁數(shù)據(jù)管理

前言


  • 在移動端的開發(fā)中,肯定免不了列表數(shù)據(jù)的展示。這里是我個人iOS開發(fā)中經(jīng)歷過的一些列表數(shù)據(jù)管理。是給viewController瘦身過程中的一些收獲,不考慮設(shè)計模式。如果您有更好的管理方式,希望能交流。謝謝。

一、 最初:剛開始開發(fā)的時候


  • 剛開始做開發(fā)的時候,在ViewController中聲明一個NSMutableArraycurrentPage 所有的數(shù)據(jù)和頁面管理都放在 ViewController 里面,使得數(shù)據(jù)雜亂,不好維護,無法重用。

@property (nonatomic, copy) NSMutableArray *list;
@property (nonatomic) NSInteger currentPage;

二、進一步:開發(fā)一定的時間后


  • 開發(fā)一段時間后,知道要把數(shù)據(jù)單獨管理,給ViewController瘦身,同時提高數(shù)據(jù)的可重用性。這個時期會聲明一個DataList來管理數(shù)據(jù),把數(shù)據(jù)解析,頁碼的管理都單獨到一個數(shù)據(jù)類中去。

  • DataList做為基類,具體的數(shù)據(jù)繼承DataList產(chǎn)生相對應(yīng)的子類,例如有一個用戶列表,則對應(yīng)的有一個UserList繼承自DataList。下面是DataList的實現(xiàn).

DataList.h

//
//  DataList.h
//  PageControlDemo
//
//  Created by brant on 2016/12/6.
//  Copyright ? 2016年 wushujun. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface DataList : NSObject

@property (nonatomic) NSInteger currentPage;            // 當(dāng)前頁碼
@property (nonatomic, strong) NSMutableArray *list;     // 數(shù)據(jù)list
@property (nonatomic) BOOL haveMore;                    // 是否有下一頁
@property (nonatomic) BOOL isRefresh;                   // 是否是刷新數(shù)據(jù),如果是刷新數(shù)據(jù),則把當(dāng)前數(shù)據(jù)清空

/**
 從網(wǎng)絡(luò)返回的數(shù)據(jù)中解析數(shù)據(jù)成model保存到list中
 
 子類要重寫這個方法來解析數(shù)據(jù),父類這里做頁碼的管理
 
 @param array 要解析的數(shù)據(jù)
 */
- (void)loadDataFromArray:(NSArray *)array;

/**
 讀取一條數(shù)據(jù)

 @param index 數(shù)據(jù)的位置
 @return 返回讀取到的數(shù)據(jù),不存在返回nil
 */
- (id)objectAtIndex:(NSInteger)index;

/**
 向數(shù)組中添加一條數(shù)據(jù)

 @param object 要添加的數(shù)據(jù)
 */
- (void)addObject:(id)object;

/**
 移除所有的數(shù)據(jù)
 */
- (void)removeAll;

@end

DataList.m

//
//  DataList.m
//  PageControlDemo
//
//  Created by brant on 2016/12/6.
//  Copyright ? 2016年 wushujun. All rights reserved.
//

#import "DataList.h"

@implementation DataList

/**
 從網(wǎng)絡(luò)返回的數(shù)據(jù)中解析數(shù)據(jù)成model保存到list中
 
 子類要重寫這個方法來解析數(shù)據(jù),父類這里做頁碼的管理

 @param array 要解析的數(shù)據(jù)
 */
- (void)loadDataFromArray:(NSArray *)array {
    
    _currentPage++;
    
    // 如果是刷新,要清空數(shù)據(jù),重置頁碼
    if (_isRefresh) {
        [self removeAll];
        self.currentPage = 0; // 這里看后臺配置,也可能是1
    }
    
    if (array == nil || array.count <= 0) {
        _haveMore = NO;
        return;
    }
}

- (id)objectAtIndex:(NSInteger)index {
    if (self.list.count > index) {
        return self.list[index];
    }
    
    return nil;
}

- (void)addObject:(id)object {
    [self.list addObject:object];
}

- (void)removeAll {
    if (_list) {
        [_list removeAllObjects];
    }
}

# pragma mark - getters

- (NSMutableArray *)list {
    if (!_list) {
        _list = [[NSMutableArray alloc] init];
    }
    
    return _list;
}

@end

UserList.m 只要重寫Load數(shù)據(jù)的方法

//
//  UserList.m
//  PageControlDemo
//
//  Created by sjwu on 2016/12/6.
//  Copyright ? 2016年 wushujun. All rights reserved.
//

#import "UserList.h"
#import "User.h"

@implementation UserList

- (void)loadDataFromArray:(NSArray *)array {
    [super loadDataFromArray:array];
    
    // 這里做array的解析
    if (array.count > 0) {
        for (NSDictionary *dic in array) {
            User *user = [User new];
            // 這里做單個user的解析
            [user loadDataFromDictionary:dic];
            [self.list addObject:user];
        }
    }
}

@end

三、再后來...

  • 再后來,各路大神寫出了各種字典轉(zhuǎn)model,model轉(zhuǎn)字典的庫,手動解析model就沒有再做過了,從最開始的JSONModel到最近用的YYModel,這些庫可以省去大部分的解析代碼,判斷代碼。

  • 開發(fā)中推薦YYModel,JSONModel在多線程寫入時,沒有做同步,會有crash的情況發(fā)生。

(2017.03.05 更新)

四、MVVM模式,ViewModel管理page

  • 最近項目中開始用RAC配合MVVM項目架構(gòu),page的管理放到viewModel中。個人感覺還是建一個對應(yīng)的listl來管理更加好。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 前言 由于最近兩個多月,筆者正和小伙伴們忙于對公司新項目的開發(fā),筆者主要負責(zé)項目整體架構(gòu)的搭建以及功能模塊的分工。...
    CoderMikeHe閱讀 27,352評論 74 270
  • 一個剛失戀的小姑娘,她年齡24歲吧。她長得圓圓的臉蛋,但是腿細,就是這種人臉大不胖。一雙小圓眼睛上支撐著個銀框眼鏡...
    趙亞寫讀書筆記閱讀 159評論 0 0
  • 方寸的世界 唯有風(fēng) 太平洋的風(fēng) 吹拂在臉上 已是微微的喟嘆 歲月的光影 在墻壁移動 蟻隊的匆忙 圍觀一次無由的傷害...
    淮河小妖閱讀 401評論 2 3
  • 我們做個好人難嗎?好人有好報嗎? 有時候,我和孩子走在路上,會看到一些很可憐的乞丐,我們不忍心的去給他一點錢...
    華敏中醫(yī)閱讀 355評論 0 0
  • xncode閱讀 1,282評論 0 2

友情鏈接更多精彩內(nèi)容