首页 > 解决方案 > 如何计算使用 Cloud Firebase 在 Swift UI 中选择一个选项的人数?

问题描述

我的 FirstView 中有 2 个选项。之后用户选择“好”或“坏”。然后用户从 SecondView 的pickerview 中选择他/她居住的城市和地区。我的目标是在 ThirdView 的用户区域中显示选择“好”的人数和选择“坏”的人数。我可以获取城市和地区名称并存储在数据库中,但我不知道如何创建一个逻辑来计算所选区域的人数。我的firebase方面如下......在此处输入图像描述 我希望ThirdView看起来像 在此处输入图像描述

struct Lokasyon: Identifiable, Codable {
var id : String
var cityName: String
var districtName: String
var okeyButton : Bool
}

class TakeViewModel: ObservableObject {

@Published var lokasyon = [Lokasyon]()

private var db = Firestore.firestore()
private var listenerRegistration: ListenerRegistration?

deinit {
    unsubscribe()
}

func unsubscribe() {
    if listenerRegistration != nil {
        listenerRegistration?.remove()
        listenerRegistration = nil
    }
}

func subscribe() {
    unsubscribe()
    if listenerRegistration == nil {
        listenerRegistration = db.collection("posts").addSnapshotListener { (querySnapshot, error) in
            guard let documents = querySnapshot?.documents else {
                print("No documents")
                return
            }
            
                 self.lokasyon = documents.compactMap { queryDocumentSnapshot in
                    
                 return try? queryDocumentSnapshot.data(as: Lokasyon.self)

            }
            
        }
        
    }
    
}

}

struct ThirdView: View {

@ObservedObject var something = TakeViewModel()

var body: some View {
    
    
    VStack{
        
        VStack(spacing: 25){
            Text("How others feel in")
            
            ForEach(something.lokasyon){i in
                
                VStack{
                
                    Text(i.cityName)
                    
                    Text(i.districtName)
                }
            }
           
            HStack{
                VStack{
                    Image("smile")
                        .resizable()
                        .aspectRatio(contentMode: .fit)
                    Text("587")
                    Text("Feeling Good")
                }
                
                VStack{
                    Image("sad")
                        .resizable()
                    .aspectRatio(contentMode: .fit)
                    Text("235")
                    Text("Feeling Bad")
                }
                
            }
        }
    }.onAppear(perform: self.something.subscribe)
}
}

我手写数字只是为了给出一个想法并展示我的最终视图。

标签: swiftgoogle-cloud-firestoreswiftui

解决方案


使用您当前的数据结构,您需要运行查询以获取该区域的文档,然后使用客户端代码计算正面和负面响应的数量。

这要求您阅读该地区的所有文档。因此,当您添加更多用户时,每个区域都会有更多用户,并且每个人都将阅读该区域中每个人的文档。这将导致您阅读的文档数量呈指数级增长,从而导致使用 Firestore 的成本增加。

更好的方法是将计数器值本身存储到数据库中,然后在每次相关的写入操作时更新它们。例如,您可以为每个原因创建一个文档,在其中记录正面和负面响应的计数,然后在有人投票时更新。

有关这方面的更多信息,请参阅有关聚合查询分布式计数器的 Firebase 文档。


推荐阅读