2016-02-29 86 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

對不起,如何更改方法聲明?我對此很陌生。謝謝! –

相關問題