gpt4 book ai didi

google-cloud-firestore - SwiftUI 列表会闪烁我的数据,然后使用 ObservableObject 显示一个空列表以获取 Firestore 数据

转载 作者:行者123 更新时间:2023-12-04 13:56:56 25 4
gpt4 key购买 nike

这是场景: Onappear 我的 View 调用我的 ObservableObject 类的 getData 方法。在调试期间,我看到它检索数据并按预期返回数组。当我的 View 出现在模拟器上时,列表上的数据会短暂闪烁,然后列表变为空白。我在我的应用程序的几个地方使用了相同的模式,在某些情况下它可以工作(列表显示应该如此),而在其他情况下它是空白的。

由于在一个或另一个上工作的各种 swiftUI 错误,我正在 13.0 和 13.3 模拟器上进行测试。我认为这可能是因为对 Firestore 的异步调用,但我已经实现了完成处理程序。如果我将 ObservedObject 更改为 @State,那么列表会正确显示,但是当添加新项目时它不会刷新。

这是不起作用的示例之一的代码:

我的看法:

import SwiftUI
import Firebase

struct ManagerListView: View {
var circuitId: String
@State private var isMgr:Bool = true //TODO: reset to false
@EnvironmentObject var session : SessionStore
@ObservedObject var managerArray = ManagerList()


func deleteMgrDb(manager: Manager) {
let docRef = Firestore.firestore().collection("circuits").document(circuitId).collection("managers").document(manager.id)

docRef.delete { (error) in
if error != nil {
print(error!.localizedDescription)
}
}
}
var body: some View {
List {
ForEach(managerArray.managers) { i in

Text("\(i.firstName) \(i.lastName) \(i.phone)").deleteDisabled(!self.isMgr)
}.onDelete { (indexset) in
let manager = self.managerArray.managers[indexset.first!]
print("Here \(self.managerArray.managers[indexset.first!])")
//TODO: Check if owner (can't remove owner) or maybe if at least one manager (then delete owner?)
self.managerArray.managers.remove(atOffsets: indexset)
self.deleteMgrDb(manager: manager)
}.disabled(!isMgr)

}.onAppear(perform: {
self.managerArray.getData(forcircuitid: self.circuitId) { (error) in
if error != nil {
//TODO: Return data error to user
print(error!.localizedDescription)
}
//TODO: isMgr
}
}).onDisappear(perform: {
self.managerArray.stopMgrListListener()
}).navigationBarItems(trailing: isMgr ?
NavigationLink(destination: CircuitManagerAddView(circuitId: self.circuitId, currentmgrs: managerArray.managers), label: {
Image(systemName: "plus")
}): nil) //.disabled(!isMgr))
}
}


我的可观察类:
class ManagerList: ObservableObject {
@Published var managers = [Manager]()

var listener: ListenerRegistration?

func getData(forcircuitid: String, completion: @escaping (Error?)->Void) {

let db = Firestore.firestore().collection("circuits").document(forcircuitid).collection("managers")

self.managers.removeAll()

listener = db.addSnapshotListener { (snapshot, error) in
if error != nil {
print(error!.localizedDescription)
completion(error)
}
else {
for i in snapshot!.documentChanges {
if i.type == .added {
let email = i.document.get("email") as! String
let lastName = i.document.get("lastname") as! String
let firstName = i.document.get("firstname") as! String
let phone = i.document.get("phonenum") as! String

let manager = Manager(id: email, lastName: lastName, firstName: firstName, phone: phone)

self.managers.append(manager)

//TODO: Changed
}
}
completion(nil)
}
}
}

对于我的工作列表,除了更改 Firestore 文档、数据元素、变量名称等之外,我使用的代码基本上完全相同。它们甚至在调试器中以相同的方式运行,唯一的区别是一些工作并显示列表和其他人没有。

最佳答案

列表项正在消失,因为 ManagerListView每次您的 ManagerList 都会重新初始化数据变化。当这种情况发生时 ManagerList也重新初始化,但您在 onAppear 中执行的代码仅在第一次出现 View 时调用,而不是在随后的数据更改时调用。
SwiftUI 不保证 @ObservedObject 的生命周期变量。你必须自己管理。在 iOS 14 中,他们引入了 @StateObject使这更容易。您可以阅读更多 here .
作为旁注,onDisappear仅在您的 View 不再显示时调用。最好在 ManagerList 中删除 Firebase 监听器从类去初始化函数中。

关于google-cloud-firestore - SwiftUI 列表会闪烁我的数据,然后使用 ObservableObject 显示一个空列表以获取 Firestore 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60783744/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com