gpt4 book ai didi

ios - 使用模型中的 Firestore 数据初始化对象

转载 作者:行者123 更新时间:2023-11-30 11:52:29 26 4
gpt4 key购买 nike

我正在寻找一种干净的方式来从我的帖子对象中分配和获取用户/作者。

我可以循环抛出 posts 数组中的每个 Post 并从 Firestore 获取用户数据并将其分配给 viewcontroller 内的 post 属性,但我正在寻找的就像是一个计算属性或惰性属性来自 Firestore 的数据并在 Post 初始化时自动将其添加到对象中。

我不知道这是否可能或是否是正确的方法,一直在努力尝试不同的方法但没有成功。

这是我当前的帖子模型 - Post.swift

struct Post {
var author: User?
let authorUID: String
let content: String

init(authorUID: String, content: String) {
self.authorUID = authorUID
self.content = content
}

var dictionary: [String:Any] {
return [
"authorUID": authorUID,
"content": content
]
}
}

在我的 viewController 中,我有一个由 Firestore 数据库中的数据填充的帖子数组 - PostViewController.swift

func loadAllPosts() {
database.collection("posts").getDocuments { (querySnapshot, error) in
if let error = error {
print("Error when loading uhuus: \(error.localizedDescription)")
} else {
self.posts = querySnapshot!.documents.flatMap({Post(dictionary: $0.data())})

DispatchQueue.main.async {
self.tableview.reloadData()
}
}
}
}

这就是我想象中的 Post 模型的样子 - Post.swift(此代码不起作用并返回“无效函数中意外的非无效返回值”错误)

struct Post {

private var database = Firestore.firestore()

var author: User?
let authorUID: String
let content: String

init(authorUID: String, content: String) {
self.authorUID = authorUID
self.content = content
}

var dictionary: [String:Any] {
return [
"authorUID": authorUID,
"content": content
]
}

private var setUser: User {
database.collection("users").document(authorUID).getDocument { (document, error) in
if let user = document.flatMap({ User(dictionary: $0.data()) }) {
return user
} else {
print("Document does not exist")
}
}
}
}

如果您没有解决方案,但现在这是不好的做法,那么我想知道为什么以及最好的方法是什么。

最佳答案

您的第二个代码片段似乎走在正确的轨道上。您可能会考虑在init Post 时触发setUser 函数,因为此时您将拥有有效的authorId.

您收到该错误的原因是您试图在 setUser 函数中返回一个User,而您真正需要的是什么要做的只是更新该特定 Post 上的 user 变量。

我建议像这样更新:

struct Post {

private var database = Firestore.firestore()

var author: User?
let authorUID: String
let content: String

init(authorUID: String, content: String) {
self.authorUID = authorUID
self.content = content
//Immediately fetch the User object here
self.setUser()
}

var dictionary: [String:Any] {
return [
"authorUID": authorUID,
"content": content
]
}

private func setUser() {
database.collection("users").document(authorUID).getDocument { (document, error) in
if let user = document.flatMap({ User(dictionary: $0.data()) }) {
//Set the user on this Post
self.author = user
} else {
print("Document does not exist")
}
}
}
}

在某种程度上不相关的说明中,您可能希望避免在每个 Post 对象中包含数据库引用。如果您继续按照此处的方式进行操作,它仍然可以工作,但跟踪此情况并不是 Post 的工作。将其放在一个单独的类中来处理数据库函数会更有意义。

关于ios - 使用模型中的 Firestore 数据初始化对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48194136/

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