私はこれまで一日中苦労してきましたが、それはうまく動作している非常に似たコードを持っているので意味がないようです。私はすべてを試しました、私は文字列配列を返す別のメソッドを作成しようとしましたが、それのどれも働いていません。たびに、postIDs配列は、ブラケットの外でアクセスされたときにカッコで囲まれたときにnullに設定されます(行 "print(self.postIDs)"の後)。あなたが私に与えるどんな助けでもありがとう。forループのためにアレイを変更できませんか?
var postIDs = [String]()
override func viewDidLoad() {
super.viewDidLoad()
tableView.dataSource = self
tableView.delegate = self
let ref = Database.database().reference()
let uid = Auth.auth().currentUser!.uid
ref.child("users").child(uid).child("saved").observeSingleEvent(of: .value, with: { snapshot in
var ids = [String]()
let saved = snapshot.value as! [String:AnyObject]
for (elem, _) in saved {
ids.append(elem)
}
self.postIDs = ids
print(self.postIDs) // returns the values I would expect
})
ref.removeAllObservers()
guard self.postIDs.count >= 1 else {return} // postIDs count is equal to 0 here, and when I print postIDs the result is []
理由がブロックされてきた前に、背景とコードの他のライン上の
作品が実行されるからです'observeSingleEvent'の中のコードは他の関数と同じスレッドにありません。 'observeSingleEvent'がバックグラウンドで実行されている間、残りはメインスレッドにあります。それらは非同期です。あなたのデータがロード完了したら 'postIDs'を取得する必要があります。 – Lawliet
期待値を取得するステートメントはクロージャ内にあります。この結果、クロージャブロックの実行が遅延します。補完ハンドラを実装できるかどうかを調べるか、それともクロージャ自体の内部で配列を使って必要な処理を行うかを試みることができます。 – Rishabh
ブロック 'observeSingleEvent'の内側と外側にブレークポイントを置くと、その違いがわかります。 – Lawliet