Swiftui 如何使用addSnapshotListener异步获取数据的元素数
我目前正在使用Swiftui 如何使用addSnapshotListener异步获取数据的元素数,swiftui,Swiftui,我目前正在使用SwiftUI和Firebase开发一个应用程序 我想写一个代码,工作如下,但它不工作 创建struct的实例时,onAppear工作并调用 ViewModel类中的addSnapshotListener,然后显示数组的 元素编号 如果Firestore中的集合有2个文档文本部分应显示2,但对于我的代码,它始终显示0 我怎样才能解决这个问题 代码如下: CheckArrayCount.swift import SwiftUI struct CheckArrayCou
SwiftUI
和Firebase
开发一个应用程序
我想写一个代码,工作如下,但它不工作
- 创建
的实例时,struct
工作并调用onAppear
类中的ViewModel
,然后显示数组的 元素编号addSnapshotListener
Firestore
中的集合
有2个文档
文本部分应显示2
,但对于我的代码,它始终显示0
我怎样才能解决这个问题
代码如下: CheckArrayCount.swift
import SwiftUI
struct CheckArrayCount: View {
@StateObject var viewModel = ViewModel()
@State var count = 0
var body: some View {
VStack{
Text("arrayCount:\(String(count))") // I want to show 2 here because viewModel.array has 2 data
}
.onAppear(){
self.count = self.viewModel.array.count
}
}
}
ViewModel.swift
import Foundation
import SwiftUI
import Firebase
class ViewModel: ObservableObject {
@Published var array = [Any]()
func getCount(){
Firestore.firestore().collection("Posts").addSnapshotListener{ //then Posts has 2 documents
(snap, err) in
guard let docs = snap else{return}
docs.documentChanges.forEach{ (doc) in
self.array.append(doc)
}
}
}
}
Xcode:12.3版
iOS:14.0现在,您实际上没有在任何地方调用
getCount
。您也不需要中间的@State
变量,因为您可以直接访问@Published
数组
这将是一个可能的解决办法:
struct CheckArrayCount: View {
@StateObject var viewModel = ViewModel()
var body: some View {
VStack{
Text("arrayCount:\(viewModel.array.count)")
}
.onAppear(){
viewModel.getCount()
}
}
}
现在,您实际上没有在任何地方调用
getCount
。您也不需要中间的@State
变量,因为您可以直接访问@Published
数组
这将是一个可能的解决办法:
struct CheckArrayCount: View {
@StateObject var viewModel = ViewModel()
var body: some View {
VStack{
Text("arrayCount:\(viewModel.array.count)")
}
.onAppear(){
viewModel.getCount()
}
}
}
根据您的代码,您的视图永远不会更新,因为您没有在整个视图中使用数组(可以观察到)。因此,还需要在视图模型中定义count var。像这样
class ViewModel: ObservableObject {
@Published var array = [Any]()
@Published var count = 0
func getCount(){
Firestore.firestore().collection("Posts").addSnapshotListener{ //then Posts has 2 documents
(snap, err) in
guard let docs = snap else{return}
docs.documentChanges.forEach{ (doc) in
self.array.append(doc)
}
self.count = self.array.count
}
}
}
并且在视图部分
struct CheckArrayCount: View {
@StateObject var viewModel = ViewModel()
var body: some View {
VStack{
Text("arrayCount:\(viewModel.count)")
}
}
}
根据您的代码,您的视图永远不会更新,因为您没有在整个视图中使用数组(可以观察到)。因此,还需要在视图模型中定义count var。像这样
class ViewModel: ObservableObject {
@Published var array = [Any]()
@Published var count = 0
func getCount(){
Firestore.firestore().collection("Posts").addSnapshotListener{ //then Posts has 2 documents
(snap, err) in
guard let docs = snap else{return}
docs.documentChanges.forEach{ (doc) in
self.array.append(doc)
}
self.count = self.array.count
}
}
}
并且在视图部分
struct CheckArrayCount: View {
@StateObject var viewModel = ViewModel()
var body: some View {
VStack{
Text("arrayCount:\(viewModel.count)")
}
}
}
谢谢你的帮助!现在很好用。谢谢你的帮助!现在效果很好,谢谢大家的支持!很好,谢谢你的支持!它工作得很好。