为什么我的 SwiftUI 列表再次附加所有对象而不是更新现有对象?
Why is my SwiftUI List appending all objects again instead of updating existing objects?
我正在使用 .addSnapshotListener
从 Firestore 读取数据并将其解析为自定义模型 Thought
对于我的 Firestore 集合中的每个文档,我将一个新的 Thought
对象附加到 @Published var thoughts
并在 List
.
中遍历 thoughts
struct Thought: Identifiable {
public var id: String?
public var name: String
public var thought: String
public var color: String
}
class Observer: ObservableObject {
@Published var thoughts = [Thought]()
init(){
self.thoughts.removeAll()
let db = Firestore.firestore()
db.collection("thoughts")
.addSnapshotListener { querySnapshot, error in
guard let documents = querySnapshot?.documents else {
print("Error fetching documents: \(error!)")
return
}
for document in documents {
var thoughtModel = Thought(id: "", name: "", thought: "", color: "")
thoughtModel.name = document.data()["name"] as! String
thoughtModel.thought = document.data()["thought"] as! String
thoughtModel.color = document.data()["color"] as! String
self.thoughts.append(thoughtModel)
}
}
}
}
struct ThoughtsView: View {
@ObservedObject var observer = Observer()
var body: some View {
VStack {
List {
ForEach(self.observer.thoughts, id: \.name) { thought in
ThoughtCard(color: thought.color,
thought: thought.thought,
name: thought.name)
}
}
}
}
}
当我在我的 Firestore 集合中进行更改或添加文档时,所有对象都附加到我的 List
而不是我的 List
只是像我期望的那样被更新。换句话说,如果我的 List
中有 3 个项目,并且我更改了其中一个 Firestore 文档中的值,我最终会在 List
中得到 6 个项目,其中包括原始的 3 个和一个副本原来的3(修改)。
如何正确更新我的 List
?
all objects are appended to my List instead of my List just being updated like I expect.
您的期望是正确的,但是...
@ObservedObject var observer = Observer()
...您的观察者仅创建一次并保存在 ThoughtsView
之外,因此即使在更新时重建视图,观察对象也使用相同的方式,所以 ...
init(){
self.thoughts.removeAll()
这段代码只被调用一次,因为它在构造函数中,实际上是无用的。然而这部分
self.thoughts.append(thoughtModel)
... 在每次更新时调用,因为它在 .addSnapshotListener
中。结果你看到你看到的 - 连续追加。
解决方案。从代码的逻辑来看,我假设你的意思是这个容器清理的地方
self.thoughts.removeAll()
for document in documents {
我正在使用 .addSnapshotListener
从 Firestore 读取数据并将其解析为自定义模型 Thought
对于我的 Firestore 集合中的每个文档,我将一个新的 Thought
对象附加到 @Published var thoughts
并在 List
.
thoughts
struct Thought: Identifiable {
public var id: String?
public var name: String
public var thought: String
public var color: String
}
class Observer: ObservableObject {
@Published var thoughts = [Thought]()
init(){
self.thoughts.removeAll()
let db = Firestore.firestore()
db.collection("thoughts")
.addSnapshotListener { querySnapshot, error in
guard let documents = querySnapshot?.documents else {
print("Error fetching documents: \(error!)")
return
}
for document in documents {
var thoughtModel = Thought(id: "", name: "", thought: "", color: "")
thoughtModel.name = document.data()["name"] as! String
thoughtModel.thought = document.data()["thought"] as! String
thoughtModel.color = document.data()["color"] as! String
self.thoughts.append(thoughtModel)
}
}
}
}
struct ThoughtsView: View {
@ObservedObject var observer = Observer()
var body: some View {
VStack {
List {
ForEach(self.observer.thoughts, id: \.name) { thought in
ThoughtCard(color: thought.color,
thought: thought.thought,
name: thought.name)
}
}
}
}
}
当我在我的 Firestore 集合中进行更改或添加文档时,所有对象都附加到我的 List
而不是我的 List
只是像我期望的那样被更新。换句话说,如果我的 List
中有 3 个项目,并且我更改了其中一个 Firestore 文档中的值,我最终会在 List
中得到 6 个项目,其中包括原始的 3 个和一个副本原来的3(修改)。
如何正确更新我的 List
?
all objects are appended to my List instead of my List just being updated like I expect.
您的期望是正确的,但是...
@ObservedObject var observer = Observer()
...您的观察者仅创建一次并保存在 ThoughtsView
之外,因此即使在更新时重建视图,观察对象也使用相同的方式,所以 ...
init(){ self.thoughts.removeAll()
这段代码只被调用一次,因为它在构造函数中,实际上是无用的。然而这部分
self.thoughts.append(thoughtModel)
... 在每次更新时调用,因为它在 .addSnapshotListener
中。结果你看到你看到的 - 连续追加。
解决方案。从代码的逻辑来看,我假设你的意思是这个容器清理的地方
self.thoughts.removeAll()
for document in documents {