AWPagedArray 是一个用 NSMutableDictionary 作为其骨干以提供通过标准 NSArray API 的透明分页的 NSProxy 子类。
这意味着数据提供者对象可以内部填充页面,而数据接收者对分页的实际工作方式一无所知。对于尚未加载的对象,代理只返回 NSNull 值。
此类对于包含来自外部 API 的分页数据的 UITableView 和 UICollectionView 特别有用。
或者您可以直接将 AWPagedArray.h 和 AWPagedArray.m 源文件添加到您的项目中。
AWPagedArray.h 和 AWPagedArray.m 到项目中(使用“产品导航”视图)。确保在从项目外提取代码存档时选择复制项目中的项目。#import "AWPagedArray.h" 在需要的位置包括 AWPagedArray。_pagedArray = [[AWPagedArray alloc] initWithCount:count objectsPerPage:pageSize];
_pagedArray.delegate = self;
[_pagedArray setObjects:objects forPage:1];在实例化分页数组后,您使用 setObjects:forPage: 方法设置页面,并将分页数组回显为 NSArray 给数据消费者(例如一个 UITableViewController)。
// DataProvider.h
@property (nonatomic, readonly) NSArray *dataObjects;
// DataProvider.m
- (NSArray *)dataObjects {
return (NSArray *)_pagedArray;
}通过 AWPagedArrayDelegate 协议,数据提供者可以在从分页数组访问数据时收到回调。这样,数据提供者可以在访问到 NSNull 值时开始加载数据页面,或者如果用户开始接近空索引,可以预加载下一页。
- (void)pagedArray:(AWPagedArray *)pagedArray
willAccessIndex:(NSUInteger)index
returnObject:(__autoreleasing id *)returnObject {
if ([*returnObject isKindOfClass:[NSNull class]] && self.shouldLoadAutomatically) {
[self setShouldLoadDataForPage:[pagedArray pageForIndex:index]];
} else {
[self preloadNextPageIfNeededForIndex:index];
}
}由于代理提供了返回对象的引用指针,它还可以动态地更改返回给消费者的内容。例如,用其他内容替换 NSNull 占位符对象。
所包含的演示项目展示了使用 AWPagedArray 的数据提供者示例实现,使用流畅分页技术填充了 UITableViewController 和 UICollectionViewController,如 这篇博客文章 中所述。
AWPagedArray 由 XCUnit 测试覆盖,这些测试可以找到在 Tests 文件夹中。
目前实现了 19 个测试。
此代码在MIT许可证的条款和条件下分发。