0

我正在尝试找出使用 Parse SDK for iOS 对结果进行分页的正确方法。我遇到的问题是我试图分页的内容有可能经常更改。

例如:

有一个应用程序在服务器上存储了一堆对象,获取这些对象的请求按照最新的优先排序并分页,以防有很多对象。当用户滚动时,当他们接近当前页面上的最后一个对象时,会请求下一页。

假设用户滚动到第二页,然后将一个新对象添加到对象列表中,然后用户向上滚动另一页。当请求下一页时,他们将获得第二页上最后一条消息的副本,并且由于第 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.
    }];
}

这不是我遇到问题的请求,而是在添加新对象时弄清楚如何正确处理表中的分页。

4

1 回答 1

0

您可以执行以下操作:

  1. 创建一个查询,该查询将返回 50 行(就像您所做的那样),按 updatedAt 排序
  2. 当您获得结果时,从列表中取出最后一项并将更新的项目保存在某个全局属性中
  3. 在下一次调用中,不要使用 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永远不会改变

于 2016-08-02T15:26:52.753 回答