2016-12-01 8 views
0

私が最初にこの質問をしたとき、私は本当に研究をしていませんでした。しかし、20時間以上経ってからは、Firebaseのドキュメントとまったく同じような構造になっています。しかし、閉鎖外のデータにはアクセスできません。Closure外のデータにアクセスする、Firebase ObserveSingleEvent // SWIFT

struct UserStruct { 
     let name : String! 
     let age : String! 
    } 

そして、それが呼び出されたときに、すべてが、データベースに完璧書かれている、それがnilで印刷されませんクロージャの内部で、それが実際の値を印刷しない:ここでは、データがに書かれるべき構造体であります明らかに。私はすでに試してみました

DispatchQueue.main.async { 

    } 

しかし、それはどちらもうまくいきませんでした、誰かガイド私!何か助けていただければ幸いです。これはFirebaseの私の最後の問題です。

 let currentUser = FIRDatabase.database().reference(withPath: "users").child((FIRAuth.auth()!.currentUser?.uid)!) 
     currentUser.observeSingleEvent(of: .value, with: { snapshot in 
     let value = snapshot.value as? NSDictionary 
     let name = value?["name"] as? String 
     let age = value?["age"] as? String 
     self.userAdded.insert(UserStruct(name: name, age: age), at: 0) // 1 
     let user = UserStruct.init(name: name, age: age) // 2 

     print("1 \(user.name)") 
     print("2 \(self.userAdded[0].name!)") 
    }) 

は、私がデータを取得する方法を2つ書いて、数2は、(2)Firebaseが示唆するような方法ですが、私も近い私ができるような構造体と外のユーザーを手に入れることができません。

+1

あなたが何を求めているのかは不明です。ファイヤーベースデータはクロージャ内で有効です。たとえば、tableViewにデータを設定したいとします。あなたが望むノードを観察すると、データがクロージャの中に返されます。スナップショットを繰り返し、配列(クロージャの外側に定義されています)とそれが完了すると、tableView.reload(まだクロージャの内側にあります)を設定します。これ以降、データは配列に格納され、作業することができます。 DispatchQueue.main.asyncを一切行う必要はありません。 – Jay

答えて

0

クロージャで作成したオブジェクトuserは、クロージャが何をしなければならないかを終了すると、割り当て解除されます。 @Jayがコメントで述べたように、クロージャーに入れたデータはの外側にあるのクロージャーに格納する必要があります。このアウトをテストするために迅速かつ汚い方法は、あなたがしているクラスの変数を作成し、userあなたがその変数にあなたの閉鎖に作成し、それが働いたかどうかを確認するために、それをプリントアウト割り当てることであろう。

//add a property in your class to store the user you get from Firebase 
var retrievedUser: UserStruct? 

let currentUser = FIRDatabase.database().reference(withPath: "users").child((FIRAuth.auth()!.currentUser?.uid)!) 
currentUser.observeSingleEvent(of: .value, with: { snapshot in 
    let value = snapshot.value as? NSDictionary 
    let name = value?["name"] as? String 
    let age = value?["age"] as? String 

    let user = UserStruct.init(name: name, age: age) 

    //assign the user retrieved from Firebase to the property above 
    self.retrievedUser = user 
    //print the local copy of the retrived user to test that it worked 
    print(retrievedUser) 
}) 
関連する問題