私は、データベース(herokuによってホストされているParse-server)からデータを取り出し、それを配列に追加するようにクエリを設定しました。このクエリ内の別のクエリは、別のクラスから情報を取得するために使用されますが、別の配列を追加するためにも使用されます。私は.findObjectsinBackground
を使用しているため、非同期的に発生し、問題につながると思います。ここでは、コード(一般)は、次のとおりです。追加機能の非同期性を修正するにはどうすればいいですか?
func getQueries(completion: (() -> Void)?){
let searchQuery = PFQuery(className: "Etc")
searchQuery.findObjectsInBackground(block: { (objects, error) in
if let objectss = objects{
for object in objectss {
//append some arrays
let otherQuery = PFQuery(className: "OtherClass")
otherQuery.whereKey("user", equalTo: object["User"] as String)
otherQuery.findObjectsInBackground(block: {(objects, error) in
if let objectss = objects{
for object in objectss{
array.append(object["ProfPic"] as PFFile)
print("\(array) and its count is \(array.count)") //this returns a non 0 value
}
}
completion!()
})
print("\(array) and its count is \(array.count)") //this returns 0
}
}
})
}
array
のカウントは、それが自身の閉鎖に追加された後に非0と返されますが、その閉鎖の0外として返されます。これは、配列が情報を表示するために反復処理に使用されるため、問題です。とにかくsearchQuery
の全体的な閉鎖が完了する前に、otherQuery
の追加が既に完了していることを確認するにはありますか? (また、非同期的に問題が発生しているという事実は推測です...間違っている可能性があります)
shallowThought、私はあなたが編集した質問のコードブロックを見て(提案何をしようとした...私は '完了を置く()'そこに...それを常に関数にラップされていた、私はそのビットを表示していない)。しかし、2番目のprint文は0を返しています。 –
書かれているように、データを取得する前にカウントを表示しています。あなたの 'print()'ステートメントを補完ブロック(または 'completion!()'の前に置きます。私の編集された答えのように。 – shallowThought