google-cloud-firestore - 如果您将它放在 for 循环中,firestore 快照侦听器是否仍然有效?我的文档可以很好地加载到@published [] 但实时更新不起作用
问题描述
请注意下面代码中的 for 循环。'players' 数组定义为 @Published 这是我的课程,它是我稍后在 forEach 列表视图中呈现的 'players' 数组(不显示任何实时更新)
class PlayerRepository: ObservableObject {
private let store = Firestore.firestore()
private let path: String = "Players"
private let friendPath: String = "MyFriends"
@Published var players: [UserProfile] = []
@Published var friendIDs: [String] = []
@EnvironmentObject var myDisplayControlCenter: DisplayControlCenter
let appDelegate = UIApplication.shared.delegate as! AppDelegate
var myfriendObjs = [Friends] ()
init() {
self.getFriendIDs()
}
func getFriends() {
for pid in friendIDs {
store.collection(path).whereField(FieldPath.documentID(), isEqualTo: pid)
.addSnapshotListener { querySnapshot, error in
guard let documents = querySnapshot?.documents else {
print("Error fetching documents: \(error!)")
return
}
for document in documents {
try? self.players.append(document.data(as: UserProfile.self)!)
}
print("Just fetched PLAYERS. #: \(self.players.count)")
}
}
}
后来,在我看来,正在观察的是 player[] 数组(它被声明为@ObservableObject)。forEach 循环效果很好,可以加载一个不错的玩家列表,但编辑、添加/更改永远不会为列表提供任何实时更新。我必须退出并回来查看更改。
这是我的观点的相关部分。
struct PlayerListView: View {
////////////////////////
///// NOTE: the players[] array that is @Published, resides in 'playerRepository' object below
////////////////////////
@ObservedObject var playerRepository = PlayerRepository()
@EnvironmentObject var authState: AuthenticationState
@State var showAddPlayerForm = false
@EnvironmentObject var myDisplayControlCenter: DisplayControlCenter
@State var showDeleteAlert = false
@State var showCopyView = false
@State var deleteIndex = 0
@State var deleteThisPlayer : [UserProfile] = []
@State private var st = false
var body: some View {
NavigationView {
VStack {
GeometryReader { geometry in
List {
Section(header: Text("Players I Have Created")) {
ForEach(playerRepository.players.sorted().filter({
"\($0.createdBy)" == self.authState.loggedInUser!.uid
}),id: \.self)
{ player in
VStack(alignment: .leading, spacing: 5) {
Text("\(player.name)")
.fontWeight(.regular)
.font(.system(size: 16))
Text("\(player.nickname)")
.fontWeight(.light)
.font(.system(size: 12))
Text("\(player.email)")
.fontWeight(.light)
.font(.system(size: 12))
NavigationLink(destination: PlayerDetailView(playerRepository: playerRepository, player: player, index: deleteIndex, editMode: 1)) {}
}
}
你能帮我理解为什么当“玩家”数组内容发生变化时我没有看到任何实时更新吗?