gpt4 book ai didi

swift - 使用可编码从 Firebase Cloud Firestore 解码集合数组

转载 作者:行者123 更新时间:2023-11-30 10:41:30 39 4
gpt4 key购买 nike

我到处都找过了,但找不到任何可以解决我遇到的问题的东西。

使用 Cloud Firestore,我想获取集合中的所有文档,这很简单,如下所示:

let ref = db.collection("users")
ref.getDocuments { (collection, error) in
guard let documents = collection?.documents else {
return
}
// I have an array of documents here
}

我想要做的是使用Codable Firebase解码这个文档数组,在获取单个文档时效果很好:

let user = try? FirestoreDecoder().decode(User.self, from: document.data())

但是,我不能这样做:

let users = try? FirestoreDecoder().decode([User].self, from: documents.map { $0.data() })

例如,来自集合中的文档数组,因为 data 参数为 [String: Any]

我可以在 for 循环中逐一解码每个文档,但我使用的是泛型,因此如果我传入 [User] 作为我的通用预期响应,我就无法在 for 循环中进行解码据我所知,查看通用元素是什么并转换为 User.self 而不是 [User].self

任何提示将不胜感激。

最佳答案

你可以尝试这个解决方案,它对我有用。让我们创建一个像 snapshotExtensions.swift 这样的扩展,其内容如下:

import Foundation
import FirebaseFirestore
extension QueryDocumentSnapshot {
func decoded<Type: Decodable>() throws -> Type {
let jsonData = try JSONSerialization.data(withJSONObject: data(), options: [])
let object = try JSONDecoder().decode(Type.self, from: jsonData)
return object
}
}

extension QuerySnapshot {
func decoded<Type: Decodable>() throws -> [Type] {
let objects: [Type] = try documents.map({try $0.decoded() })
return objects
}
}

在你的 ViewController 中,你可以使用:

Firestore.firestore().collection("your_collection").getDocuments { (snapshot, error) in
self.myModelArray = try! snapshot!.decoded()
}

这是一个迟到的回复,但我希望它对其他人有帮助:)

关于swift - 使用可编码从 Firebase Cloud Firestore 解码集合数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56699923/

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