动态内容分页
Pagination With Dynamic Content
我正在尝试找出使用 iOS 的 Parse SDK 对结果进行分页的正确方法。我遇到的问题是我尝试分页的内容可能会经常更改。
例如:
有一个应用程序在服务器上存储了一堆对象,并且请求获取这些对象是最新的在前排序并分页,以防对象很多。当用户滚动时,当他们接近当前页面上的最后一个对象时,将请求下一页。
假设用户滚动到第二页,然后将一个新对象添加到对象列表中,然后用户向上滚动另一页。当请求下一页时,他们将获得第二页上最后一条消息的副本,并且由于第 0 页已经加载,因此不会显示新对象。
这种情况怎么处理?
如果对象按最旧的顺序排序,实现会发生什么变化?
在此先感谢您的帮助。
编辑:请求伪代码
- (void)fetchObjectsForPage:(NSUInteger)page completion:(void (^)(NSArray *_Nullable objects, PageInfo *_Nullable pageInfo, NSError *_Nullable error))completion{
PFQuery *query = [SomeObject query];
[query orderByAscending:@"updatedAt"];
[query setLimit:50];
[query setSkip:50 * page];
[query findObjectsInBackgroundWithBlock:^{NSArray *_Nullable objects, NSError *_Nullable error){
...
>>> Do error checking and return array along with paging info (total number of objects, page size) or error in completion block.
}];
}
这不是我遇到问题的请求,它正在弄清楚如何在添加新对象时正确处理 table 中的分页。
您可以做的是:
- 创建一个查询,将 return 50 行(像您一样)按 updatedAt
排序
- 当你得到结果时,从列表中取出最后一项并将该项目保存在一些全局 属性
- 在下一次调用中不要使用 setOffset,而是获取接下来的 50 行并添加另一个条件,即 updatedAt 大于全局对象的 updatedAt。这样你就可以确保你的列表中不会有重复的记录
最后您的代码应如下所示:
PFQuery *query = [PFQuery queryWithClassName:@"SomeClassName"];
[query orderByAscending:@"updatedAt"];
[query setLimit:50];
if (self.lastItemUpdatedAt){
[query whereKey:@"updatedAt" greaterThan:self.lastItemUpdatedAt];
}
[query findObjectsInBackgroundWithBlock:^(NSArray * _Nullable objects, NSError * _Nullable error) {
if (objects.count > 0){
self.lastItemUpdatedAt = [[objects lastObject] updatedAt];
}
}];
现在,如果您使用 updatedAt,您仍然有可能得到重复项,因为我们假设有人更改了对象,因此 updatedAt 也会更改(因此它会大于您保存的 updatedAt)如果你可以使用 createdAt 而不是 updatedAt 因为 createdAt 永远不会改变
我正在尝试找出使用 iOS 的 Parse SDK 对结果进行分页的正确方法。我遇到的问题是我尝试分页的内容可能会经常更改。
例如:
有一个应用程序在服务器上存储了一堆对象,并且请求获取这些对象是最新的在前排序并分页,以防对象很多。当用户滚动时,当他们接近当前页面上的最后一个对象时,将请求下一页。
假设用户滚动到第二页,然后将一个新对象添加到对象列表中,然后用户向上滚动另一页。当请求下一页时,他们将获得第二页上最后一条消息的副本,并且由于第 0 页已经加载,因此不会显示新对象。
这种情况怎么处理?
如果对象按最旧的顺序排序,实现会发生什么变化?
在此先感谢您的帮助。
编辑:请求伪代码
- (void)fetchObjectsForPage:(NSUInteger)page completion:(void (^)(NSArray *_Nullable objects, PageInfo *_Nullable pageInfo, NSError *_Nullable error))completion{
PFQuery *query = [SomeObject query];
[query orderByAscending:@"updatedAt"];
[query setLimit:50];
[query setSkip:50 * page];
[query findObjectsInBackgroundWithBlock:^{NSArray *_Nullable objects, NSError *_Nullable error){
...
>>> Do error checking and return array along with paging info (total number of objects, page size) or error in completion block.
}];
}
这不是我遇到问题的请求,它正在弄清楚如何在添加新对象时正确处理 table 中的分页。
您可以做的是:
- 创建一个查询,将 return 50 行(像您一样)按 updatedAt 排序
- 当你得到结果时,从列表中取出最后一项并将该项目保存在一些全局 属性
- 在下一次调用中不要使用 setOffset,而是获取接下来的 50 行并添加另一个条件,即 updatedAt 大于全局对象的 updatedAt。这样你就可以确保你的列表中不会有重复的记录
最后您的代码应如下所示:
PFQuery *query = [PFQuery queryWithClassName:@"SomeClassName"];
[query orderByAscending:@"updatedAt"];
[query setLimit:50];
if (self.lastItemUpdatedAt){
[query whereKey:@"updatedAt" greaterThan:self.lastItemUpdatedAt];
}
[query findObjectsInBackgroundWithBlock:^(NSArray * _Nullable objects, NSError * _Nullable error) {
if (objects.count > 0){
self.lastItemUpdatedAt = [[objects lastObject] updatedAt];
}
}];
现在,如果您使用 updatedAt,您仍然有可能得到重复项,因为我们假设有人更改了对象,因此 updatedAt 也会更改(因此它会大于您保存的 updatedAt)如果你可以使用 createdAt 而不是 updatedAt 因为 createdAt 永远不会改变