使用常规 UIViewController 分页解析查询
Paginate parse queries using a regular UIViewController
我有一个 UIViewController
,里面有一个表格视图。我使用常规方法填充表格视图。我使用名为 loadEntries
的方法调用我的查询。
问题是 loadEntries
的条目数量可能超过数万。
我不想将我的 ViewController 更改为 PFQueryTableViewController,如果有从 UIViewcontroller 更改为 PFQueryTableViewController 的偷偷摸摸的方法,则可以例外。
所以我的问题是:是否可以使用 parse.com 查询实现分页(不使用 PFQueryTableViewController),如果可以,如何实现?
您需要查看 PFQuery
的 skip
参数,如讨论的那样 here in Parse's PFQuery Documentation。
您可以 运行 第一次查询只是一个计数,然后您将能够确定您将拥有多少页数据。
然后,您可以根据 "page" 用户当前正在查看的内容 运行 使用 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:
。稍后,当用户在数据页面之间导航时,您将再次调用它,传入新的 pageIndex
和 count
(每页记录数)值。您可以重构它以继续引用 self.recordsPerPage
作为实例变量。
直接来自Parse.com:
Caveat: Count queries are rate limited to a maximum of 160 requests per minute. They can also return inaccurate results for classes with more than 1,000 objects. Thus, it is preferable to architect your application to avoid this sort of count operation (by using counters, for example.)
我的注意事项:
limit
的默认值为 100。
limit
的最大允许值为 1,000。
skip
的默认值为 0(零)。
skip
的最大允许值为 10,000。
- 因此,您无法通过一个未经修改的查询可靠地查询超过 11,000 个对象。 (您可以使用
createdAt
或其他方式进行高级搜索,但这些将是具有不同约束的 PFQuery
个实例。)
我有一个 UIViewController
,里面有一个表格视图。我使用常规方法填充表格视图。我使用名为 loadEntries
的方法调用我的查询。
问题是 loadEntries
的条目数量可能超过数万。
我不想将我的 ViewController 更改为 PFQueryTableViewController,如果有从 UIViewcontroller 更改为 PFQueryTableViewController 的偷偷摸摸的方法,则可以例外。
所以我的问题是:是否可以使用 parse.com 查询实现分页(不使用 PFQueryTableViewController),如果可以,如何实现?
您需要查看 PFQuery
的 skip
参数,如讨论的那样 here in Parse's PFQuery Documentation。
您可以 运行 第一次查询只是一个计数,然后您将能够确定您将拥有多少页数据。
然后,您可以根据 "page" 用户当前正在查看的内容 运行 使用 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:
。稍后,当用户在数据页面之间导航时,您将再次调用它,传入新的 pageIndex
和 count
(每页记录数)值。您可以重构它以继续引用 self.recordsPerPage
作为实例变量。
直接来自Parse.com:
Caveat: Count queries are rate limited to a maximum of 160 requests per minute. They can also return inaccurate results for classes with more than 1,000 objects. Thus, it is preferable to architect your application to avoid this sort of count operation (by using counters, for example.)
我的注意事项:
limit
的默认值为 100。limit
的最大允许值为 1,000。skip
的默认值为 0(零)。skip
的最大允许值为 10,000。- 因此,您无法通过一个未经修改的查询可靠地查询超过 11,000 个对象。 (您可以使用
createdAt
或其他方式进行高级搜索,但这些将是具有不同约束的PFQuery
个实例。)