如何使用swift在iOS应用程序中以编程方式计算Parse类中的行?

Par*_*ari 3 ios parse-platform swift

我的iOS应用程序有一个解析后端.我有一个名为"测验"的解析类.如何读取Parse类中的行数,我必须在我的iOS应用程序中使用它?

我使用以下代码但xcode没有进入代码块.

var cnt = 1
var query = PFQuery(className:"quiz")
query.findObjectsInBackgroundWithBlock {
(objects: [PFObject]?, error: NSError?) -> Void in
if error == nil 
{
// The find succeeded.
print("Successfully retrieved \(objects!.count) scores.")
cnt = objects!.count
}
else
{
// Log details of the failure
print("Error: \(error!) \(error!.userInfo)")                   
}
}
return cnt  
Run Code Online (Sandbox Code Playgroud)

谢谢!

Rus*_*ell 5

快速回答

findObjectsInBackgroundWithBlock受查询限制约束,默认情况下最多返回100个对象.此限制可以增加,但最多只能增加1000.因此,您不能依赖findObjects并计算结果.

Parse在文档中包含了一种计算类或特定查询的对象总数的简单方法.

var query = PFQuery(className:"GameScore")
query.whereKey("playerName", equalTo:"Sean Plott")
query.countObjectsInBackgroundWithBlock {
  (count: Int32, error: NSError?) -> Void in
  if error == nil {
    print("Sean has played \(count) games")
  }
}
Run Code Online (Sandbox Code Playgroud)

斯威夫特3

let query = PFQuery(className:"GameScore")
 query.whereKey("playerName", equalTo:"Sean Plott")
 query.countObjectsInBackground { (count, error) in
    if error == nil {
           print("Sean has played \(count) games")
    }
}
Run Code Online (Sandbox Code Playgroud)

详细说明

还应该注意的是,由于计数操作的成本很高,Parse对它们进行了限制

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

此不准确性不是由于1000请求对象限制.count查询将尝试获取无论大小的记录总数,但由于操作可能需要很长时间才能完成,因此在该窗口期间数据库可能已更改,并且返回的计数值可能不会更长时间有效.

处理计数的推荐方法是使用云代码中的保存触发器之前/之后基本维护您自己的索引.但是,这也是一种非理想的解决方案,因为保存挂钩可以在任何时候任意失败,并且(更糟糕的)postSave挂钩没有错误传播.另外,这是Parse Developers Google Group的 Hector Ramos的另一个引用.

一旦你抛出一些约束,计数查询总是很昂贵.如果你只关心集合的总大小,你可以运行一个没有任何约束的计数查询,并且一个应该非常快,因为得到记录的总数是一个不同的问题,而不是计算其中有多少匹配任意约束列表.这只是使用数据库系统的现实.

最后,引用Parse Engineering博客文章:在Parse上构建可扩展的应用程序.

假设您正在构建产品目录.您可能希望在顶级导航屏幕上显示每个类别中的产品数量.如果为每个UI元素运行计数查询,它们将无法在大型数据集上高效运行,因为MongoDB不使用计数B树.相反,我们建议您使用单独的Parse对象来跟踪每个类别的计数.无论何时添加或删除产品,您都可以在afterSave或afterDelete Cloud Code处理程序中递增或递减计数.