使用 AFIncrementalStore 和 AFRestClient 进行分页

Posted

技术标签:

【中文标题】使用 AFIncrementalStore 和 AFRestClient 进行分页【英文标题】:Pagination with AFIncrementalStore and AFRestClient 【发布时间】:2013-07-02 01:33:09 【问题描述】:

谁能展示一些关于如何使用 AFPaginator 进行分页的示例。我正在使用 AFRestClient,我需要在我对实体的请求中关联 pagerId、offset 和 count 参数。

在我看来,通过使用 AFPaginator 关联这些参数应该是直截了当的。我搜索了一些示例,但找不到任何示例。

【问题讨论】:

【参考方案1】:

我可以在分页方面取得一些进展,但还没有完成。

如果获取请求的 fetchLimit 和 fetchOffset 不为零,它将根据请求创建参数。

所以,在我的AFRESTClient 子类上,在创建请求之前,在方法@​​987654322@ 上,我将分页器设置为:

NSMutableDictionary *mutableParameters = [NSMutableDictionary dictionary];
self.paginator = [AFPageAndPerPagePaginator paginatorWithPageParameter:@"page" perPageParameter:@"per"];
[mutableParameters addEntriesFromDictionary:[self.paginator parametersForFetchRequest:fetchRequest]];
request = [self requestWithMethod:@"GET" path:@"feed" parameters:mutableParameters];

这将生成一个类似http://domain.com/feed?page=1&per=20 的请求。页面根据fetchOffsetFetchLimit计算为

NSUInteger perPage = fetchRequest.fetchLimit == 0 ? kAFPaginationDefaultPerPage : fetchRequest.fetchLimit;
NSUInteger page = fetchRequest.fetchOffset == 0 ? kAFPaginationDefaultPage : (NSUInteger)floorf((float)fetchRequest.fetchOffset / (float)perPage) + 1;

所以,我可以让 fetch 请求另一个页面,但由于我使用的是 NSFetchedResultsController,所以当我滚动 UITableView 时,我无法让它请求另一个页面。我试图做一些事情:

[NSFetchedResultsController deleteCacheWithName:[self.fetchedResultsController cacheName]];
self.fetchedResultsController.fetchRequest.fetchOffset = self.visibleChunk * self.chunkSize;
[_fetchedResultsController performSelectorOnMainThread:@selector(performFetch:) withObject:nil waitUntilDone:NO modes:@[ NSRunLoopCommonModes ]];

这里,visibleChunk应该用来带另一个页面,chunkSize是一个API请求所需的item数。

这不是对您问题的直接回复,但我希望它可以帮助您找到答案并在此处发布:)

如果我发现更多内容,我会更新。

【讨论】:

我设法让它工作。但它不适用于 NSFetchedResultsController。使用 NSFetchRequest,您只需将fetchOffset 设置为fetchLimit 的倍数。所以,如果你想为每页 10 个项目获取第 2 页,设置 fetchOffset 等于 20,使用这个更改的 NSFetchRequest 对象执行新的 fetch,你就完成了。

以上是关于使用 AFIncrementalStore 和 AFRestClient 进行分页的主要内容,如果未能解决你的问题,请参考以下文章

AFIncrementalStore:仅使用 ID 拉取相关实体

带有 MagicalRecord 和多个商店的 AFIncrementalStore

AFIncrementalStore 将核心数据与 REST API 同步

RestKit 和 AFIncrementalStore 的区别

使用 AFIncrementalStore 时返回的部分关系数据如何处理?

使用 afincrementalstore 处理关系 ID