【发布时间】:2020-09-14 13:49:06
【问题描述】:
我正在尝试从 firebase firestore 获取集合。下面是我的 ViewModel 我无法将数据存储在 @Published var 类别对象中。我无法找到确切的问题,我对 swift 有点陌生,但前一段时间完全相同的事情正在工作,我做错了什么吗?
FormViewModel.swift
import Firebase
import FirebaseFirestore
class FormViewModel: ObservableObject {
@Published var categories = [Category]()
private var db = Firestore.firestore()
func fetchCategories() {
db.collection("companies_by_category").addSnapshotListener { (QuerySnapshot, error) in
guard let documents = QuerySnapshot?.documents else {
print("No documents")
return
}
self.categories = documents.compactMap { (QueryDocumentSnapshot) -> Category? in
return try? QueryDocumentSnapshot.data(as: Category.self)
}
print(self.categories) // -> Able to get data
}
}
}
我的分类视图
struct CategoriesView: View {
@ObservedObject var viewmodel = FormViewModel()
var body: some View {
ScrollView {
List(self.viewmodel.categories) { category in
ZStack {
RoundedRectangle(cornerRadius: 15, style: .continuous)
//.foregroundColor(category.selected == true ? Color.yellow.opacity(0.5) : Color.white)
.foregroundColor(.white)
.shadow(color: Color.black.opacity(0.1), radius: 10, x: 0, y: 0)
VStack(spacing: 20) {
HStack {
Image("\(category.category)")
.foregroundColor(Color.gray)
.font(.system(size: 20.0))
Text(category.category)
.font(.system(size: 20.0, weight: .medium))
.foregroundColor(Color.black)
Spacer()
}
}
.padding()
}
}
}
.onAppear() {
self.viewmodel.fetchCategories()
}
}
}
【问题讨论】:
-
这是因为您正在对数据库进行异步调用,因此在返回数据之前执行打印。由于
categories已发布,因此您不必担心这一点,因此当数组获取值时,任何观察者都会收到通知。 -
谢谢我错过了它是异步的事实,但正如大卫在答案中解释的那样,问题不在于@Published,而在于@observed 对象,因为我在视图本身中创建它。
标签: swift firebase google-cloud-firestore swiftui