2016-05-01 7 views
-1

プロジェクトでCloudKitを使用していて、クラウドのデータをロードしてユーザーが既にクラウドにいるかどうかを確認していますが、loadUser()関数を呼び出すと、実際の値より前の値が表示されます。ここでは、コードは次のとおりです。関数が値を返すのが速すぎる

override func viewDidLoad() { 
    super.viewDidLoad() 

    var shouldSaveUser = Bool() 
    shouldSaveUser = loadUser() 

    if shouldSaveUser == true { 
     send2Cloud() 
    } else { 
     print("\nUSER ALREADY IN THE CLOUD\n") 
    } 
} 

func loadUser() -> Bool { 

    users = [CKRecord]() 

    let publicData = CKContainer.defaultContainer().publicCloudDatabase 
    let predicate = NSPredicate(format: "id == %@", id) 
    let query = CKQuery(recordType: "User", predicate: predicate) 

    publicData.performQuery(query, inZoneWithID: nil) { (results: [CKRecord]?, error: NSError?) -> Void in 

     publicData.performQuery(query, inZoneWithID: nil) { 
      records, error in 
      if error != nil { 
       print(error?.localizedDescription) 
      } 
     } 

     if let users = results { 
      self.users = users 
      print("\nHow many users: \(self.users.count)\n") 

      if self.users.count != 0 { 
       self.aux = false 
      } else { 
       self.aux = true 
      } 
      print("\n\(self.aux)") 
     } 
    } 
    print("\n\(self.aux)") 
    return self.aux 
} 

は今のところ、私は0のユーザーを持っているので、self.auxloadUser()が間違った値を返した後にのみ起こる等しいtrue、する必要があります!ここでは、コンソールに表示される順序です:

false 
USER ALREADY IN THE CLOUD 
How many users: 0 
true 

それはtrueなるが、これはtrueに変化した時点で既に手遅れである必要があります! これを修正する方法を知っている人はいますか?どんな助けもありがとう!みんなありがとう!

+1

非同期操作では通常の戻り値を使用できません。戻り値ではなく完了ハンドラで 'loadUser'を設定してください。 – rmaddy

+0

'performQuery'を2回呼び出すのはなぜですか? – rmaddy

+0

@rmaddyありがとう!それについて知らなかった。あなたの答えは本当に役に立ちました!! –

答えて

-1

あなたのコードでは、バックグラウンドスレッドでpublicData.performQuery、その行われたときに、それはそうブロックの実行外publicData.performQuery後のコードの結果が返される前に

if error != nil { 
    print(error?.localizedDescription) 
        } 

を呼び出しを実行しているようです。したがって、このクエリに依存するコードを内部に配置する必要があります。if error != nil { //CODE HERE }

関連する問題