我的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
谢谢!
findObjectsInBackgroundWithBlock受查询限制的约束,默认情况下最多返回100个对象。可以增加此限制,但最多只能增加1000。因此,您不能依靠findObjects然后计算结果。
findObjectsInBackgroundWithBlock
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处理程序中增加或减少计数。