Paginate使用常规UIViewController解析查询

时间:2015-01-10 11:47:04

标签: ios objective-c uiviewcontroller parse-platform

我有UIViewController,其中包含一个tableview。我使用常规方法填充tableview。我使用名为loadEntries的方法调用我的查询。

问题是loadEntries的条目数量可能超过数万。

我宁愿不将我的ViewController更改为PFQueryTableViewController,如果有一种偷偷摸摸的方式从UIViewcontroller更改为PFQueryTableViewController,则可以进行异常。

所以我的问题是:是否可以用parse.com查询实现分页(不使用PFQueryTableViewController),如果是,怎么做?

1 个答案:

答案 0 :(得分:10)

您需要查看skip所提及的PFQuery参数here in Parse's PFQuery Documentation

您可以第一次运行查询作为计数,然后您将能够确定您将拥有多少页数据。

然后,您可以根据用户当前正在查看的“页面”,使用skip和“count”值运行查询。

这样的事情:

- (void)countRecords {
    PFQuery *query = [PFQuery queryWithClassName:@"className"];
    // Other query parameters assigned here...
    [query countObjectsInBackgroundWithBlock:^(int count, NSError *error) {
        // Do better error handling in your app...
        self.recordCount = count;
        self.pageCount   = count / self.recordsPerPage + 1;
        [self loadRecordsForPageIndex:0 countPerPage:self.recordsPerPage];
    }];
}
- (void)loadRecordsForPageIndex:(NSInteger)pageIndex countPerPage:(NSInteger)count {
    PFQuery *query = [PFQuery queryWithClassName:@"className"];
    // Other query parameters assigned here...
    query.limit    = count;
    query.skip     = pageIndex * count;
    [query findObjects... // You should know this part
}

在上面的示例中,-countRecords获取与您的查询匹配的记录的当前计数,然后自动调用-loadRecordsForPageIndex:countPerPage:。稍后,当用户在数据页面之间导航时,您将再次调用它,传入新的pageIndexcount(每页记录数)值。你可以重构这个,以便继续引用self.recordsPerPage作为它的实例变量。

直接来自Parse.com:

  

警告:计数查询的速率限制为每分钟最多160个请求。它们还可以为具有1,000个以上对象的类返回不准确的结果。因此,最好设计您的应用程序以避免这种计数操作(例如,通过使用计数器。)

MY CAVEATS:

  1. limit的默认值为100。
  2. limit允许的最大值为1,000。
  3. skip的默认值为0(零)。
  4. skip允许的最大值为10,000。
  5. 因此,您无法使用一个未经修改的单个查询可靠地查询超过11,000个对象。 (您可以使用createdAt或其他东西获得高级和搜索,但这些实例将是PFQuery具有不同约束的实例。)