2016-12-01 88 views
0

當我第一次問這個問題時,我沒有真正完成我的研究。但是在這20多個小時後,我的結構與Firebase文檔完全相同。但是,我無法訪問閉包之外的任何數據。這裏就是數據應該被寫入到結構:在關閉之外訪問數據Firebase ObserveSingleEvent // SWIFT

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

而當它被調用,一切都寫在完美的數據庫,它不打印零封裏面,它打印的實際值明顯。我已經嘗試過

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)是火力地堡暗示的方式,但我甚至不能得到用戶保持外接近像我可以與結構。

+1

目前還不清楚你在問什麼。 firebase數據在閉包內有效,所以例如你想填充一個tableView。你觀察你想要的節點,然後數據在閉包內返回。你迭代快照並填充一個數組(在閉包之外定義),一旦完成,tableView.reload(仍在閉包內)。從那時起,你的數據被存儲在數組中,並可以使用。您根本不需要執行DispatchQueue.main.async。 – Jay

回答

0

您在關閉中創建的對象將在關閉完成所需操作時釋放。正如@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) 
})