2017-08-11 11 views
-2

私はこれまで一日中苦労してきましたが、それはうまく動作している非常に似たコードを持っているので意味がないようです。私はすべてを試しました、私は文字列配列を返す別のメソッドを作成しようとしましたが、それのどれも働いていません。たびに、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 [] 
+0

理由がブロックされてきた前に、背景とコードの他のライン上の

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 }) 

作品が実行されるからです'observeSingleEvent'の中のコードは他の関数と同じスレッドにありません。 'observeSingleEvent'がバックグラウンドで実行されている間、残りはメインスレッドにあります。それらは非同期です。あなたのデータがロード完了したら 'postIDs'を取得する必要があります。 – Lawliet

+0

期待値を取得するステートメントはクロージャ内にあります。この結果、クロージャブロックの実行が遅延します。補完ハンドラを実装できるかどうかを調べるか、それともクロージャ自体の内部で配列を使って必要な処理を行うかを試みることができます。 – Rishabh

+0

ブロック 'observeSingleEvent'の内側と外側にブレークポイントを置くと、その違いがわかります。 – Lawliet

答えて

0

コールバックが

0

チェックは、次のコード

override func viewDidLoad() { 

     super.viewDidLoad() 
     usersTableView.dataSource = self 
     usersTableView.delegate = self 
//  getSnapShot() 


     let databaseRef = Database.database().reference() 

     databaseRef.child("Users").observe(.value, with: { (snapshot) in 

      if snapshot.exists() { 
       self.postData = snapshot.value! as! [String : AnyObject] 
       self.postData.removeValue(forKey: self.appDelegate.KeyValue) 
//    self.getUserNames(Snapshot: self.postData) 
      } 
      else{ 
       print("No users") 
      } 
      print(self.postData) //Does not return nil 
      self.getSnapShot() //Take snapshot outside paranthesis 
     }) 

     print(self.postData) //Returns nil 
    } 


    func getSnapShot() { 

     print(self.postData) //Value of Snapshot is printed 

    } 
+0

早急に対応してくれてありがとうございます。 – Matt

+0

はい問題がまだ起きている場合はお知らせください。 –

+0

うまくいきましたか? –

関連する問題