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许可证的条款和条件下分发。