swiftyboi
swiftyboi

Reputation: 3221

How can I get more than 1000 results from a Parse query?

I've been trying to chain to no success. After an initial query, I attempt to count the results. Then, I check to see if the results are equal to the limit of the query. If they are the same, I create a new query and repeat.

All I'm getting is the results of the first query, however.

Code is here:

  var allObjects = [PFObject]()

    var skip = 0
    var limit = 10

    var downloadCards = PFQuery(className: "Checklist")
    downloadCards.whereKey("createdBy", equalTo:PFUser.currentUser()!)
    downloadCards.includeKey("card")
    downloadCards.orderByAscending("IndexNumber")
    downloadCards.limit = limit
    downloadCards.skip = skip
    downloadCards.findObjectsInBackgroundWithBlock {
        (objects: [AnyObject]?, error: NSError?) -> Void in
        if error == nil {

            if let objects = objects as? [PFObject] {
                for object in objects {
                    if let card = object["card"] as? PFObject {
                        allObjects.append(card)
                    }
                }
            }

//1000
                if objects!.count == limit {
                    //Query again until results aren't equal to limit
                    skip = skip + limit
                    var downloadCards2 = PFQuery(className: "Checklist")
                    downloadCards2.whereKey("createdBy", equalTo:PFUser.currentUser()!)
                    downloadCards2.includeKey("card")
                    downloadCards2.orderByAscending("IndexNumber")
                    downloadCards2.limit = limit
                    downloadCards2.skip = skip
                    downloadCards2.findObjectsInBackgroundWithBlock {
                        (objects: [AnyObject]?, error: NSError?) -> Void in
                        if error == nil {

                            if let objects = objects as? [PFObject] {
                                for object in objects {
                                    if let card = object["card"] as? PFObject {
                                        allObjects.append(card)
                                    }
                                }
                            }

Upvotes: 0

Views: 566

Answers (1)

Chaitanya Shah
Chaitanya Shah

Reputation: 173

You can set the "skip" variable to 1,000, 2,000, etc. as you get more results up to 10,000 skips. After that, you can follow the directions here: https://parse.com/questions/paging-through-more-than-10000-results

Edit:

Apologies - I might have misread your question.

1) You should rename the variables in your second loop to objects2, error2, card2, etc. similar to downloadCards2.

2) Alternatively, to make your code scalable and DRY, I would make allObjects, skip, and limit properties and simply re-run the same query again.

func runQuery() {
    var downloadCards = PFQuery(className: "Checklist")
    downloadCards.whereKey("createdBy", equalTo:PFUser.currentUser()!)
    downloadCards.includeKey("card")
    downloadCards.orderByAscending("IndexNumber")
    downloadCards.limit = limit
    downloadCards.skip = skip
    downloadCards.findObjectsInBackgroundWithBlock {
        (objects: [AnyObject]?, error: NSError?) -> Void in
        if error == nil {

            if let objects = objects as? [PFObject] {
                for object in objects {
                    if let card = object["card"] as? PFObject {
                        allObjects.append(card)
                    }
                }
            }

            if objects!.count == limit {
                 skip = skip + limit
                 self.runQuery()
            }
       }    
    }  
}

Upvotes: 3

Related Questions