私は以前に投稿した質問の中で非同期関数について学びましたが、別のものを組み込む必要がありました。 Firebaseからエントリのリストを読み込み、リストを返して配列に割り当てています。非同期関数は問題なく返されますが、配列は空になります
今、問題は、配列を呼び出し関数に戻すと配列が空になってしまい、その理由がわかりません。
func getListItems(uid: String, completion: (list: Array<String>?) -> Void) {
let ref = Firebase(url: getFirebaseURL() + "/" + uid)
var taskList = [String]()
ref.observeSingleEventOfType(.Value, withBlock: { snapshot in
let enumerator = snapshot.children
while let rest = enumerator.nextObject() as? FDataSnapshot {
taskList.append(rest.value as! String)
}
completion(list: taskList)
})
}
をそして、これは私がその関数を呼び出して、私はそれらの項目を追加することができるようにローカル配列に代入しようとしている方法です:
私はFirebaseのエントリーを集めていますどのようにこれがある(正常に動作します)テーブルビュー:
// Retrieve database items
let uid = def.valueForKey("uid") as! String
getListItems(uid) {
(result) in
self.taskListItems = result!
//print(result) // This prints out an array filled with my data
}
print(taskListItems) // This prints an empty array
私はprint(result)
を行う場合、それは完璧な配列を吐き出すが、私は地元の配列を印刷するとき、私は使用しようとしていますではありません。私もどちらかので、私は本当に何が起こっているかで迷ってしまいました動作しませんでした.append
を使用してみましたがvar taskListItems = [String]()
:私はとtaskListItems
を定義しています。
競合状態があります。クロージャ内のコードは、別のスレッドで発生しています。配列を印刷する頃には、クロージャーコードは完了していません。 – ryantxr
これは多くの、何度もStack Overflowで扱われていますので、尋ねる前に検索してください。例えば、私の答えはこちらを見てください:http://stackoverflow.com/a/33699235/341994 – matt
@mattはい、私は**非同期関数について学んでいましたが、私は明らかに**学習しません**なぜ私はここにお尋ねします – dsch