【iOS开发】浅谈iOS列表分页数据管理
时间:2022-06-09
本文章向大家介绍【iOS开发】浅谈iOS列表分页数据管理,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
前言
- 在移动端的开发中,肯定免不了列表数据的展示。这里是我个人iOS开发中经历过的一些列表数据管理。是给
viewController
瘦身过程中的一些收获,不考虑设计模式。如果您有更好的管理方式,希望能交流。谢谢。
一、 最初:刚开始开发的时候
- 刚开始做开发的时候,在
ViewController
中声明一个NSMutableArray
和currentPage
所有的数据和页面管理都放在ViewController
里面,使得数据杂乱,不好维护,无法重用。
@property (nonatomic, copy) NSMutableArray *list; @property (nonatomic) NSInteger currentPage;
二、进一步:开发一定的时间后
- 开发一段时间后,知道要把数据单独管理,给
ViewController
瘦身,同时提高数据的可重用性。这个时期会声明一个DataList
来管理数据,把数据解析,页码的管理都单独到一个数据类中去。 -
DataList
做为基类,具体的数据继承DataList
产生相对应的子类,例如有一个用户列表,则对应的有一个UserList
继承自DataList
。下面是DataList
的实现.
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; // 当前页码
@property (nonatomic, strong) NSMutableArray *list; // 数据list
@property (nonatomic) BOOL haveMore; // 是否有下一页
@property (nonatomic) BOOL isRefresh; // 是否是刷新数据,如果是刷新数据,则把当前数据清空
/**
从网络返回的数据中解析数据成model保存到list中
子类要重写这个方法来解析数据,父类这里做页码的管理
@param array 要解析的数据
*/
- (void)loadDataFromArray:(NSArray *)array;
/**
读取一条数据
@param index 数据的位置
@return 返回读取到的数据,不存在返回nil
*/
- (id)objectAtIndex:(NSInteger)index;
/**
向数组中添加一条数据
@param object 要添加的数据
*/
- (void)addObject:(id)object;
/**
移除所有的数据
*/
- (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
/**
从网络返回的数据中解析数据成model保存到list中
子类要重写这个方法来解析数据,父类这里做页码的管理
@param array 要解析的数据
*/
- (void)loadDataFromArray:(NSArray *)array {
_currentPage++;
// 如果是刷新,要清空数据,重置页码
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数据的方法
//
// 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
三、再后来...
- 再后来,各路大神写出了各种
字典
转model
,model
转字典
的库,手动解析model
就没有再做过了,从最开始的JSONModel
到最近用的YYModel
,这些库可以省去大部分的解析代码,判断代码。 - 开发中推荐
YYModel
,JSONModel
在多线程写入时,没有做同步,会有crash的情况发生。
(2017.03.05 更新)
四、MVVM模式,ViewModel管理page
- 最近项目中开始用RAC配合MVVM项目架构,page的管理放到viewModel中。个人感觉还是建一个对应的listl来管理更加好。
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 自定义SAP Spartacus Cart界面
- 还是只使用console.log()进行调试?好吧,其实还有更多。
- SNMP++: Transport is not supported
- Codeforces Round #666 (Div. 2) A-D
- 深度剖析前端JavaScript中的原型(JS的对象原型)
- dotnet OpenXML 颜色变换
- n维空间的多面体的有向测度和重心
- 只会Vue怎么开发小程序?Vue和微信小程序的到底有哪些区别?
- VBA CreateObject函数如何找到所需要的依赖文件
- dotnet OpenXML 如何获取 schemeClr 颜色
- API——注册表读取
- VBA操作注册表
- VBA快速提取引用工程的代码
- NuGet 如何设置图标
- VBA解析VBAProject 00