在Swift中限制没有query.limit的Parse查询

时间:2015-06-18 18:15:49

标签: ios swift parse-platform

我需要在同一个Parse查询中做两件事。 1)我需要找到给定查询返回的对象总数; 2)仅显示前20个对象。我不能通过设置query.limit = 20来做到这两点,因为对象的总数只有20个。如果对象的总数是100,我需要得到这个数字。

那么,我怎样才能以编程方式只显示前20个对象,同时仍然接收所有100个对象?

var query = PFQuery(className: "Professions")
            query.whereKey("user", equalTo: PFUser.currentUser()!.username!)
            query.orderByDescending("createdAt")
            // query.limit = 20
            query.findObjectsInBackgroundWithBlock({ (objects, error) -> Void in
                if error == nil {
                    if let objects = objects as? [PFObject] {

                        for object in objects {

                        // I tried using something like:
                        // for var i = 0; i <= 20; i++ {
                        // if object[i] {
                        // But get 'Int' is not convertible to 'String'

                            if let title = object["title"] as? String {
                                println(title)
                            }

                        }
                    }

                } else {

                    println(error)

                }
            })

当我尝试设置以下内容时,我总是得到fatal error: array index out of range.

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

        return 20

    }

2 个答案:

答案 0 :(得分:0)

也许不是最优雅的解决方案,但我认为你需要在同一个查询上做两个查询。一个用于object.count,另一个用于query.limit

var query = PFQuery(className: "Professions")
        query.whereKey("user", equalTo: PFUser.currentUser()!.username!)
        query.orderByDescending("createdAt")
        query.findObjectsInBackgroundWithBlock({ (objects, error) -> Void in
            if error == nil {
                if let objects = objects as? [PFObject] {
                          var numberOfObjects = objecs.count
                    }
              else {
                println(error)
            }
        query.limit = 20
        query.findObjectsInBackgroundWithBlock {
        (objects: [AnyObject]?, error: NSError?) -> Void in
        if error == nil {
          if let objects = objects as? [PFObject] {
                    for object in objects {
                        if let title = object["title"] as? String {
                            println(title)
              }
            }
         }
         else {
                println(error)
            }
        }
        })

答案 1 :(得分:0)

首先,如果您只需要计算对象,Parse has a method for that

query.countObjectsInBackgroundWithBlock

然后你可以发出另一个PFQuery来获得前20个对象。获取所有对象只是为了在本地计算它们是糟糕的设计。

尽管如此,如果您仍然有充分的理由检索所有对象(受到Parse在1000处的限制)并在本地处理它们,那么在获取所有对象后,在本地获取前20个Parse,it's done in Swift对象。

var fetchedProfessions = [PFObject]()

var query = PFQuery(className: "Professions")
query.whereKey("user", equalTo: PFUser.currentUser()!.username!)
query.orderByDescending("createdAt")
query.limit = 100
query.findObjectsInBackgroundWithBlock({ (objects, error) -> Void in
    if error == nil {
        if let objects = objects as? [PFObject] {

            // Capture your results
            self.fetchedProfessions = objects
        }
    } else {
        print(error)
    }
})

// Get the first 20
let firstTwentyProfessions = retrievedObjects[0..19]