分页动态内容

时间:2016-08-02 13:09:48

标签: ios objective-c parse-platform pagination scroll-paging

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

例如:

有一个应用程序在服务器上存储了一堆对象,并且获取这些对象的请求首先按最新排序,并且在有大量对象的情况下进行分页。当用户滚动时,当他们接近当前页面上的最后一个对象时,会请求下一页。

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

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

1 个答案:

答案 0 :(得分:0)

您可以做的是:

  1. 按照updatedAt
  2. 创建一个返回50行(就像您所做的那样)的查询
  3. 获得结果时,从列表中取出最后一项,并将项目updatedAt保存在某个全局属性
  4. 在下一次调用中,不要使用setOffset,而是获取接下来的50行,并添加另一个条件,即updatedAt大于全局对象的updatedAt。这样,您可以确保列表中没有重复记录
  5. 最后,您的代码应如下所示:

    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 永远不会被更改