前言
- 在移動(dòng)端的開發(fā)中,肯定免不了列表數(shù)據(jù)的展示。這里是我個(gè)人iOS開發(fā)中經(jīng)歷過的一些列表數(shù)據(jù)管理。是給
viewController
瘦身過程中的一些收獲,不考慮設(shè)計(jì)模式。如果您有更好的管理方式,希望能交流。謝謝。
一、 最初:剛開始開發(fā)的時(shí)候
- 剛開始做開發(fā)的時(shí)候,在
ViewController
中聲明一個(gè)NSMutableArray
和currentPage
所有的數(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)model
,model
轉(zhuǎn)字典
的庫,手動(dòng)解析model
就沒有再做過了,從最開始的JSONModel
到最近用的YYModel
,這些庫可以省去大部分的解析代碼,判斷代碼。開發(fā)中推薦
YYModel
,JSONModel
在多線程寫入時(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來管理更加好。