小编典典

如何使用Swift在iOS应用中以编程方式对Parse类中的行进行计数?

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

谢谢!


阅读 346

收藏
2020-07-07

共1个答案

小编典典

快速回答

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")
  }
}

迅捷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")
    }
}

详细说明

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

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

这种不准确性不是由于1000个请求对象限制。计数查询将尝试获取记录总数,而不管其大小如何,但是由于该操作可能需要大量时间才能完成,因此数据库可能在该窗口期间发生了更改,并且返回的计数值可能没有不再有效。

推荐的计数方法是在云端代码中使用保存触发器之前/之后实质上维护自己的索引。但是,这也是一个非理想的解决方案,因为保存挂钩可能会任意途中失败,并且(更糟糕的)postSave挂钩也不会传播错误。除此之外,这是Parse
Developers Google Group的
Hector Ramos的另一句话。

一旦引入一些约束,计数查询就一直很昂贵。如果您只关心集合的总大小,则可以在没有任何约束的情况下运行计数查询,并且该查询应该很快,因为获取记录总数就是与计算其中有多少匹配任意约束列表相比,这是一个不同的问题。这只是使用数据库系统的现实。

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

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

2020-07-07