【发布时间】:2021-01-05 19:05:00
【问题描述】:
我正在关注一个关于将 Firebase 数据放入 SwiftUI 中的列表视图的互联网教程,但该教程使用了 Firestore,所以我现在只能靠自己了。我拥有所有数据,但是当我打开 PlayerListView 时,列表为空。但是,当我打印时,所有数据都打印得很完美。
这是我所拥有的:
import SwiftUI
import Firebase
struct Player: Identifiable {
var id: String = UUID().uuidString
var username: String
var score: Int
}
struct PlayerListView: View {
@ObservedObject var viewModel = PlayerViewModel()
@Binding var showLeaderboard: Bool
var body: some View {
NavigationView {
List(viewModel.players) { player in
VStack(alignment: .leading) {
Text(player.username)
.font(.headline)
Text("\(player.score)")
.font(.subheadline)
}
}
.navigationBarTitle("Players")
.onAppear() {
self.viewModel.fetchData() { player in
print(player)
}
}
}
.onTapGesture {
self.showLeaderboard.toggle()
}
}
}
class PlayerViewModel: ObservableObject {
@Published var players = [Player]()
let ref = Database.database().reference().child("users")
func fetchData(completion: @escaping(Array<Player>) -> Void) {
ref.observeSingleEvent(of: .value, with: {(snapshot: DataSnapshot) in
if let result = snapshot.children.allObjects as? [DataSnapshot] {
for child in result {
let orderID = child.key
self
.ref
.child(orderID)
.queryOrdered(byChild: "score")
.observeSingleEvent(of: .value, with: {(snapshot: DataSnapshot) in
let value = snapshot.value as? NSDictionary
self.players.append(
Player(id: .init(),
username: value?["username"] as? String ?? "",
score: value?["score"] as? Int ?? 0))
completion(self.players)
})
}
}
})
}
}
【问题讨论】:
-
你试过在主线程上发布
players数组:DispatchQueue.main.async { self.players.append(...) } -
刚试了下还是没有显示
标签: swift firebase listview firebase-realtime-database swiftui