2016-03-27 8 views
1

私は以前に投稿した質問の中で非同期関数について学びましたが、別のものを組み込む必要がありました。 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を定義しています。

+0

競合状態があります。クロージャ内のコードは、別のスレッドで発生しています。配列を印刷する頃には、クロージャーコードは完了していません。 – ryantxr

+0

これは多くの、何度もStack Overflowで扱われていますので、尋ねる前に検索してください。例えば、私の答えはこちらを見てください:http://stackoverflow.com/a/33699235/341994 – matt

+0

@mattはい、私は**非同期関数について学んでいましたが、私は明らかに**学習しません**なぜ私はここにお尋ねします – dsch

答えて

1

なぜなら、print(taskListItems)の行がブロック内のprint(result)より前に呼び出されているからです。これは、HTTPリクエストが非同期であり、終了後にブロック内のコードを実行するためです(print(taskListItems)の呼び出し後)。あなたがすべきことは、ブロック内の結果を使用するコードを持つことです。

+0

ありがとう!私はすべてのエントリを表示するためにテーブルビューを使用しているので、複数の場所からアクセス可能にする必要があると思います。私がやったのは、私のテーブルビューを更新して登場させただけだった。 – dsch

関連する問題