专栏首页吴老师移动开发【iOS开发】浅谈iOS列表分页数据管理

【iOS开发】浅谈iOS列表分页数据管理

前言


  • 在移动端的开发中,肯定免不了列表数据的展示。这里是我个人iOS开发中经历过的一些列表数据管理。是给viewController瘦身过程中的一些收获,不考虑设计模式。如果您有更好的管理方式,希望能交流。谢谢。

一、 最初:刚开始开发的时候


  • 刚开始做开发的时候,在ViewController中声明一个NSMutableArraycurrentPage 所有的数据和页面管理都放在 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

三、再后来...

  • 再后来,各路大神写出了各种字典modelmodel字典的库,手动解析model就没有再做过了,从最开始的JSONModel到最近用的YYModel,这些库可以省去大部分的解析代码,判断代码。
  • 开发中推荐YYModelJSONModel在多线程写入时,没有做同步,会有crash的情况发生。

(2017.03.05 更新)

四、MVVM模式,ViewModel管理page

  • 最近项目中开始用RAC配合MVVM项目架构,page的管理放到viewModel中。个人感觉还是建一个对应的listl来管理更加好。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【iOS开发】Cocoapods详解-使用及创建私有库

    CocoaPods现在是通过target来组织的,如果项目有多个target,可以写多个target为每个target引入不同的第三方库。 写法:

    吴老师
  • 【iOS开发】UITableView和UICollectionView多种类型cell处理,更好地组织代码

    开发不仅仅是完成功能,还要写出认后来人可以很容易上手维护的代码。今天就记录一下列表数据,多种类型cell时,如何更好的组织代码。从实际需求场景出发,先看一下UI...

    吴老师
  • 【iOS开发】iOS 动画详解

    在移动开发中,为了提高用户体验,会用到一些动画来提高应用的视觉效果。让人有眼前一亮的感觉。同时有动画的过渡过程,会让应用看起来不是那么的生硬,更吸引用户。

    吴老师
  • 【iOS开发】启动时间优化,runloop的一个小技术点

    刚接触项目不久,最近产品说有一个点要优化,App的启动页面显示时间太长了。一直在开发其它的app,还真没注意这个点,去看了一下还真是,有的时候启动页面的显示时间...

    吴老师
  • 【iOS开发】RxSwift入门:从Observable.create讲起

    刚学习RxSwift的时候,到github看文档,搜索别人的博客。基本上都是从那些例子讲起,像下面这样,自己再跟着用playground写一篇。

    吴老师
  • 如何在Linux,Mac或Windows上安装Git

    Git是由Linus Torvalds为Linux内核设计开发的。Git为非线性的分布式开发提供了支持,允许多个项目成员同时在一个项目上进行开发。Git是最流行...

    Techeek
  • 【iOS开发】UITableView优化

    移动开发中,任何一个应用都或多或少的有列表的存在,列表的上下滑动直接关系到用户体验。如果处理不好,就会使得列表滑动起来有明显的卡顿效果。所以对列表的优化,让它更...

    吴老师
  • 【iOS开发】一些不错的文章博客整理

    吴老师
  • 【iOS开发】RxSwift中的Subject(PublishSubject/BehaviorSubject/ReplaySubject/Variable)

    PublishSubject 即是一个被观察者(Observable)也是一个观察者 (Observer)

    吴老师

扫码关注云+社区

领取腾讯云代金券