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)")
        }
    }
}

谢谢你的帮助!现在很好用。谢谢你的帮助!现在效果很好,谢谢大家的支持!很好,谢谢你的支持!它工作得很好。