我试图从firebase文档中获取一些数据,并将其显示在ListView中。获取数据并将其解码到我自己的结构中是很好的(通过让控制台打印它来测试),但是它不会出现在实际的ListView中。我尝试创建2个示例数据集,以查看我的struct和/或ListView的实现是否有问题,但这些数据集显示得很好。我最好的猜测是,ListView对我从firebase文档获得的id并不满意。
下面是我获取数据的方式(请忽略checkAvailablePkgs()中的丑陋解决方案,这将改变):
class firebaseController : ObservableObject {
let databaseFIRB = Firestore.firestore()
@Published var forUserAvailablePkgs : [DLPackage] = []
func checkAvailablePkgs() {
if Auth.auth().currentUser != nil {
var allAccessiblePkgs : [String] = []
let userUID = Auth.auth().currentUser!.uid
databaseFIRB.collection("user-access").document(userUID).getDocument { (document, error) in
if let document = document, document.exists {
let dataDescription = document.data().map(String.init(describing:)) ?? "nil"
let pkgArr = dataDescription.components(separatedBy: ", ")
for partString in pkgArr {
var tmpStringSlicing : String
tmpStringSlicing = partString.replacingOccurrences(of: "\": <null>", with: "")
tmpStringSlicing = tmpStringSlicing.replacingOccurrences(of: "[\\[\\]\"]", with: "", options: .regularExpression)
allAccessiblePkgs.append(tmpStringSlicing)
}
self.checkIndividualPkgInformation(pkgIDs: allAccessiblePkgs)
} else {
print("Document does not exist")
}
}
}
}
func checkIndividualPkgInformation(pkgIDs: [String]) {
for id in pkgIDs {
databaseFIRB.collection("download-pkgs").document(id).getDocument { (document, error) in
if let document = document, document.exists {
let result = Result {
try document.data(as: DLPackage.self)
}
switch result {
case .success(let pkg):
if let pkg = pkg {
// A `Package` value was successfully initialized from the DocumentSnapshot.
print("Package: \(pkg)")
self.forUserAvailablePkgs.append(pkg)
} else {
// A nil value was successfully initialized from the DocumentSnapshot,
// or the DocumentSnapshot was nil.
print("Document does not exist")
}
case .failure(let error):
// A `City` value could not be initialized from the DocumentSnapshot.
print("Error decoding package: \(error)")
}
} else {
print("Package-Document does not exist")
}
}
}
}
}这是我想要将其保存为:
struct DLPackage: Identifiable, Codable {
@DocumentID var id = UUID().uuidString
var name : String = ""
var size : String = ""
var contentpaths : [String] = [""]
}下面是拒绝显示所需数据的ListView:
struct FIRBauthView: View {
let firebaseCtrl: firebaseController = firebaseController()
var body: some View {
VStack() {
List(firebaseCtrl.forUserAvailablePkgs) {item in
HStack() {
Text(String(item.name)).font(.custom("Avenir", size: 26))
Spacer()
Text(String(item.size)).font(.custom("Avenir", size: 26))
}
}
Button {
firebaseCtrl.checkAvailablePkgs()
} label: {
Text("Check")
}
}
}
}我可以给我的firebaseControler().forUserAvailablePkgs一个初始值为:
forUserAvailablePkgs.append(contentsOf: [DLPackage(name: "Example", size: "1GB", contentpaths: ["hello","something"]),DLPackage(name: "Nr2", size: "1GB", contentpaths: ["hello","something else"])])他们会很好的出现。
这是我从加载到forUserAvailablePkgs数组的防火墙数据中打印出来的:
[Light_Player.DLPackage(_id: FirebaseFirestoreSwift.DocumentID<Swift.String>(value: Optional("CDB68E0C-DCE2-4FAA-AD55-872322A55E56")), name: "Example", size: "1GB", contentpaths: ["hello", "something"]),
Light_Player.DLPackage(_id: FirebaseFirestoreSwift.DocumentID<Swift.String>(value: Optional("DCAAF136-24FE-470A-B897-2D178AEDB3A0")), name: "Nr2", size: "1GB", contentpaths: ["hello", "something else"]),
Light_Player.DLPackage(_id: FirebaseFirestoreSwift.DocumentID<Swift.String>(value: Optional("package2")), name: "Bewährte Klassiker", size: "3.4GB", contentpaths: ["placeholder for another path", "placeholder for a different path"]),
Light_Player.DLPackage(_id: FirebaseFirestoreSwift.DocumentID<Swift.String>(value: Optional("package1")), name: "Basic", size: "7.3GB", contentpaths: ["placeholder for path", "placeholder for path 2"])]我尝试将结构的id更改为:
@DocumentID var id: String?因为我在网上的一个教程中找到了它,但是代码并不是这样复制的。
在从数据库中获取数据之后,我还尝试用生成的UUID覆盖防火墙数据中的it,但仍然无法让ListView显示它。
任何帮助都是非常感谢的。
发布于 2022-03-01 08:59:03
好吧,在睡了一个好觉之后,我暂时的失明被治愈了,我发现在我看来,我错过了“观察对象”的属性。
struct FIRBauthView: View {
@ObservedObject var firebaseCtrl: firebaseController = firebaseController()而不是
struct FIRBauthView: View {
let firebaseCtrl: firebaseController = firebaseController()现在,数据正按预期显示。
https://stackoverflow.com/questions/71297800
复制相似问题