【发布时间】:2018-01-10 18:44:50
【问题描述】:
我正在寻找一种干净的方式来从我的帖子对象中分配和获取用户/作者。
我可以循环抛出帖子数组中的每个帖子,并从 Firestore 获取用户数据并将其分配给视图控制器中的帖子属性,但我正在寻找的是一个计算属性或惰性属性从 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 (此代码不起作用并返回“Unexpected non-void return value in void function”错误)
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")
}
}
}
}
如果您没有解决方案,但现在这是不好的做法,那么我想知道为什么以及最好的方法是什么。
【问题讨论】:
-
您在编译时遇到的错误告诉您您正在返回一个 void 函数中的值。您实际上是从闭包返回,而不是从动态 var getter 块返回。如果您删除返回调用,您将在 setUser 块中获得缺少的返回。
标签: ios swift firebase google-cloud-firestore