Welcome to the Treehouse Community

Want to collaborate on code errors? Have bugs you need feedback on? Looking for an extra set of eyes on your latest project? Get support with fellow developers, designers, and programmers of all backgrounds and skill levels here with the Treehouse Community! While you're at it, check out some resources Treehouse students have shared here.

Looking to learn something new?

Treehouse offers a seven day free trial for new students. Get access to thousands of hours of content and join thousands of Treehouse students and alumni in the community today.

Start your free trial

iOS

Michael Lee
Michael Lee
2,855 Points

Cloudkit Query

I'm trying to save and store the user's data, then retrieve it and check for a value, pushing the corresponding view controller.

However, despite only having 1 user record in my cloudkit dashboard, i'm getting 33 results, forcing me to change my code and preventing it from working.

This was my original code:

    let container = CKContainer.defaultContainer()
    let privateDB = container.privateCloudDatabase
    let resultPredicate = NSPredicate(format: "TRUEPREDICATE")
    let query = CKQuery(recordType: "UserData", predicate: resultPredicate)
    query.sortDescriptors = [NSSortDescriptor(key: "MODIFIED", ascending: false)]

    privateDB.performQuery(query, inZoneWithID: nil) { (results, error) -> Void in

        if error != nil {
            print("\(error)")
        }
        else{

       for record in results! {

                self.weight = record["weight"] as? Int
                self.height = record["height"] as? Int
                self.age = record["age"] as? Int
                self.gender = record["genderFemale"] as? Int

                if self.weight == nil {
                    print("push weightVC")
                    let weightVC = WeightViewController()
                    self.navigationController?.pushViewController(weightVC, animated: false)
                }

                else if self.height == nil {
                    print("push heightVC")
                    let heightVC = HeightViewController()
                    self.navigationController?.pushViewController(heightVC, animated: false)
                }

                else if self.age == nil {
                    print("push ageVC")
                    let ageVC = DOBViewController()
                    self.navigationController?.pushViewController(ageVC, animated: false)
                }

                else if self.gender == nil{
                    print("push genderVC")
                    let genderVC = GenderViewController()
                    self.navigationController?.pushViewController(genderVC, animated: false)
                }
                else{
                    let planVC = PlanOriginViewController()
                    self.navigationController?.pushViewController(planVC, animated: false)
                }

I was forced to change it to this: privateDB.performQuery(query, inZoneWithID: nil) { (results, error) -> Void in

        if error != nil {
            print("\(error)")
        }
        else{

            print("\(results?.count)")

            for record in results! {

                self.weight = record["weight"] as? Int
                self.height = record["height"] as? Int
                self.age = record["age"] as? Int
                self.gender = record["genderFemale"] as? Int

                self.arrayOfUserData?.addObject(record)
                print("record added")
            }

        }
    }

    print(arrayOfUserData)

    if arrayOfUserData != nil{
    let ckRecord = arrayOfUserData![0]

    self.weight = ckRecord["weight"] as? Int
    self.height = ckRecord["height"] as? Int
    self.age = ckRecord["age"] as? Int
    self.gender = ckRecord["genderFemale"] as? Int

    if self.weight == nil {
        print("push weightVC")
        let weightVC = WeightViewController()
        self.navigationController?.pushViewController(weightVC, animated: false)
    }

    else if self.height == nil {
        print("push heightVC")
        let heightVC = HeightViewController()
        self.navigationController?.pushViewController(heightVC, animated: false)
    }

    else if self.age == nil {
        print("push ageVC")
        let ageVC = DOBViewController()
        self.navigationController?.pushViewController(ageVC, animated: false)
    }

    else if self.gender == nil{
        print("push genderVC")
        let genderVC = GenderViewController()
        self.navigationController?.pushViewController(genderVC, animated: false)
    }
    else{
        let planVC = PlanOriginViewController()
        self.navigationController?.pushViewController(planVC, animated: false)
    }

    } else {

    }

However, this doesn't work as well. XCode is skipping over the privateDB query block and going straight to the line print(arrayOfUserData), before returning to the privateDB query.