2016-02-29 85 views
0

我试图保存并存储用户的数据,然后检索并检查值,并推送相应的视图控制器。在swift中查询私人数据库以获取用户详细信息

但是,尽管我的cloudkit仪表板中只有4个用户记录,但我得到33个结果,迫使我更改我的代码并阻止其工作。

这是我原来的代码:

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

我不得不把它改成这样:

 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 { 

    } 

然而,这并不正常工作。在返回到privateDB查询之前,XCode正在跳过privateDB查询块并直接转到行打印(arrayOfUserData)。

谢谢!

+0

我很困惑这里的问题。你想完成什么或不理解? –

+0

我想查询CloudKit,看看用户是否已经键入某些值,并根据他有或没有键入的内容,将他指向某个视图控制器。 –

+0

,目前它在做什么。 –

回答

0

你的问题是你假设你的文件是单线程的。您希望评估什么字段在您从数据库查询中收到结果后未填写。你需要的是一个完成块。这使您可以查询数据库,然后评估结果。我会围绕这些方面做些事情。

首先添加一个完成处理程序,为您提供一个用户对象。我假设你有一个用户定义应该看起来像这样

struct User{ 
    weight:Int 
    height:Int 
    age:Int 
    gender:Sting 
} 

在你的查询方法中添加你的完成处理程序。

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

    let resutltData = results.value as [String:AnyObject] ?? [:] 
     let users : [User] = resutltData.flatMap { record in 
      let weight = record["weight"] as? Int ?? "" 
      let height = record["height"] as? Int ?? "" 
      let age = record["age"] as? Int ?? "" 
      let gender = record["gender"] as? String ?? "" 
     } 
     completion(user) 
} 

现在,当你调用privateDB.performQuery你应该把它保存在一个变量和预制品支票那里。事情是这样的:

func ProcessUsers(){ 
    let users = privateDB.performQuery(query, inZoneWithID: nil, completion:{ (User) in 
    self.user = User 
    switch user{ 
     case .weight: 
      if .weight == "" { 
       print("push weightVC") 
       let weightVC = WeightViewController() 
       self.navigationController?.pushViewController(weightVC, animated: false) } else { 
        fallthrough 
       } 

     case .height: 
      if .height == "" { 
       print("push heightVC") 
       let heightVC = heightViewController() 
       self.navigationController?.pushViewController(heightVC, animated: false) } else { 
        fallthrough 
       } 
     case .age: 
      if .age == "" { 
       print("push ageVC") 
       let ageVC = ageViewController() 
       self.navigationController?.pushViewController(ageVC, animated: false) } else { 
        fallthrough 
       } 
     case .gender: 
      if .gender == "" { 
       print("push genderVC") 
       let genderVC = genderViewController() 
       self.navigationController?.pushViewController(genderVC, animated: false) } else { 
        fallthrough 
       } 

让我知道如果您对此有任何问题。我希望它有帮助。

+0

谢谢!为了澄清,我需要重新定义ProcessUsers()中的privateDB,因为我在viewDidLoad中声明它,对吗?此外,XCode给我的错误“额外参数”完成'在调用中'行privateDB.performQuery(查询,inZoneWithID:nil,完成:((用户))){(结果,错误) - > Void in ' –

+0

雅所以我假设你创建了'privateDB',所以你需要添加一个完成处理程序,以便在你拥有它之后处理数据。所以如果你不改变方法声明,Xcode会给你那个错误。 –

+0

对不起,如何更改方法声明?我对此很陌生。谢谢! –

相关问题