2016-02-29 2 views
0

Я пытаюсь сохранить и сохранить данные пользователя, затем получить его и проверить значение, нажав соответствующий контроллер представления.Запрос частной базы данных в swift для получения более подробной информации

Однако, несмотря на то, что у меня есть 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 { 

    } 

Однако, это не работает, как хорошо. XCode пропускает блок запроса privateDB и переходит прямо к распечатке строки (arrayOfUserData), прежде чем вернуться к запросу privateDB.

Спасибо!

+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

Спасибо! Чтобы уточнить, мне нужно переопределить privateDB в ProcessUsers(), потому что я объявляю его в viewDidLoad, правильно? Кроме того, XCode дает мне ошибку «дополнительный аргумент» для завершения «в вызове» для строки 'privateDB.performQuery (запрос, inZoneWithID: nil, завершение: ([Пользователь])) {(результаты, ошибка) -> Пустота в ' –

+0

Ya, поэтому я предполагал, что вы создали' privateDB', поэтому вам нужно добавить обработчик завершения, чтобы вы обрабатывали данные после его появления. Поэтому, если вы не измените объявление метода Xcode, вы получите эту ошибку. –

+0

Извините, как мне изменить объявление метода? Я новичок в этом. Благодаря! –