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

前言


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

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


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

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

二、進(jìn)一步:開發(fā)一定的時(shí)間后


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

  • DataList做為基類,具體的數(shù)據(jù)繼承DataList產(chǎn)生相對(duì)應(yīng)的子類,例如有一個(gè)用戶列表,則對(duì)應(yīng)的有一個(gè)UserList繼承自DataList。下面是DataList的實(shí)現(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中
 
 子類要重寫這個(gè)方法來解析數(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中
 
 子類要重寫這個(gè)方法來解析數(shù)據(jù),父類這里做頁碼的管理

 @param array 要解析的數(shù)據(jù)
 */
- (void)loadDataFromArray:(NSArray *)array {
    
    _currentPage++;
    
    // 如果是刷新,要清空數(shù)據(jù),重置頁碼
    if (_isRefresh) {
        [self removeAll];
        self.currentPage = 0; // 這里看后臺(tái)配置,也可能是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];
            // 這里做單個(gè)user的解析
            [user loadDataFromDictionary:dic];
            [self.list addObject:user];
        }
    }
}

@end

三、再后來...

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

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

(2017.03.05 更新)

四、MVVM模式,ViewModel管理page

  • 最近項(xiàng)目中開始用RAC配合MVVM項(xiàng)目架構(gòu),page的管理放到viewModel中。個(gè)人感覺還是建一個(gè)對(duì)應(yīng)的listl來管理更加好。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

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