I'm fairly new to Swift so my apologies if this is something obvious, but so far I have not found an answer.
So, I'm trying to show a list of "friends" in a view and that data comes from a Firebase Realtime Database. The data is being pulled but it gets pulled after the function is finished running.
I also tried to make it work with await async, but the firebase methods don't support that as far as I saw while trying.
If you look at the function bellow, the view and the print outputs, you'll see what I mean by that.
This is the get friends function in my firebase controller file:
func getFriends(completion: @escaping ([Friend])-> Void) {
print("start getFriends")
self.friends = []
let ref = Database.database().reference(fromURL: "users")
ref.queryOrderedByKey().observeSingleEvent(of: .value) { (snapshot) in
print("entering data snapshot pull")
let snapshotValue = snapshot.value as! [String:[String:[String:AnyObject]]]
for (key, _) in snapshotValue {
for (_, value) in snapshotValue[key]! {
var email = ""
var userName = ""
var id = ""
for (key, value) in value {
switch key{
case "email":
email = value as? String ?? ""
case "userName":
userName = value as? String ?? ""
case "id":
id = value as? String ?? ""
default:
print("")
}
}
print("--------------------------")
print(userName)
print(email)
print(id)
self.friends.append(Friend(userName: userName, email: email, id: id))
}
}
print("leaving data snapshot pull")
}
print("end getFriends")
completion(friends)
}
This is my view:
struct ChatListView: View {
typealias Friend = ChatList<String>.Friend
@State var friends : [Friend] = []
@ObservedObject var chatListUI: ChatListUI
var firebaseController = FirebaseDatabaseController()
var body: some View {
Button(action: {
do {
try Auth.auth().signOut()
}
catch {
print("cant log out")
}
}, label: {
Text("Log out")
})
List {
ForEach(friends) { Friend in
Text(Friend.userName)
}
}.onAppear(perform: {
print("start onAppear in view")
firebaseController.getFriends(){ productsArray in
self.friends = productsArray
}
print("friends count:")
print(friends.count)
print("end onAppear in view")
})
}
}
and this is the output:
2022-01-05 13:20:32.273898+0100 ChatBuddy[2094:38382] [error] warning: View context accessed for persistent container ChatBuddy with no stores loaded
CoreData: warning: View context accessed for persistent container ChatBuddy with no stores loaded
start onAppear in view
start getFriends
end getFriends
friends count:
0
end onAppear in view
2022-01-05 13:20:32.655201+0100 ChatBuddy[2094:38562] 8.10.0 - [GoogleUtilities/AppDelegateSwizzler][I-SWZ001014] App Delegate does not conform to UIApplicationDelegate protocol.
entering data snapshot pull
--------------------------
ArdianNuhiji
Nuhijiardian@hotmail.com
ItAoaKj5ZTamf3BHikbdYsHmMhq2
--------------------------
Test
Test@hotmail.com
QkpSyxmV5MfqmhPobdOtQI97cdP2
--------------------------
Test2
Test2@hotmail.com
8xSa6Ff73JMJSq1418rgWtil6442
--------------------------
Test1
Test1@hotmail.com
WQ3f9OnmJTOtbxdEXMEB2j4q3bu2
leaving data snapshot pull
2022-01-05 13:20:32.917846+0100 ChatBuddy[2094:38562] [boringssl] boringssl_metrics_log_metric_block_invoke(151) Failed to log metrics