如何计算使用 Cloud Firebase 在 Swift UI 中选择一个选项的人数?

Posted

技术标签:

【中文标题】如何计算使用 Cloud Firebase 在 Swift UI 中选择一个选项的人数?【英文标题】:How to count the number of people selecting one option in Swift UI using Cloud Firebase? 【发布时间】:2020-10-19 10:32:41 【问题描述】:

我的 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)


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

【问题讨论】:

【参考方案1】:

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

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

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

有关这方面的更多信息,请参阅 aggregation queries 和 distributed counters 上的 Firebase 文档。

【讨论】:

先生,感谢您的快速回复。我仍然无法弄清楚如何计算城市。假设我创建了一个文档,仅包含好或坏响应的数量。我怎么知道投票用户的选择对应于不同文档中的城市选择。如果您想查看我的所有代码都在链接中。 github.com/ozanones/firestoredeneme 如果您的问题是关于如何保护计数,那是另一个问题。有多种方法可以做到这一点(云功能、安全规则),firebase.google.com/docs/firestore/solutions/aggregation 也涵盖了这些方法。 不,这与安全关系无关。我很难找到一条正确的路径来计算该城市和地区的选择数量。除了列出所有城市和地区的名称然后计算之外,我想不出任何不同的方法,但这是太多的工作,无法处理。我确信有一种简单的方法可以实现这一目标。我也在使用 Swift UI 和 MVVM 结构,这也很复杂,因为我是这方面的初学者。 如果您想有效地检索特定位置的特定投票类型的计数,您需要存储每个位置的每种投票类型的计数,而 Firestore 无法解决这个问题。对此我无话可说。如果您认为工作量太大,您可能需要考虑使用更擅长处理即席查询的数据库,例如大多数基于 SQL 或 GraphQL 的数据库。

以上是关于如何计算使用 Cloud Firebase 在 Swift UI 中选择一个选项的人数?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用 Firebase Cloud Messaging 控制台的情况下向 Flutter/Firebase Cloud Messaging 上的特定设备发送通知 [重复]

如何使用 Firebase Cloud Messaging 在前台显示多个通知

React Hooks 不适用于 Firebase Cloud Functions 错误:不变违规:无效的钩子调用

如何使用 PHP 在 Firebase 中自动导入存储桶 - Google Cloud Storage

如果用户长时间没有写入,如何使用 Firebase Cloud Functions 在 Firebase 数据库中设置节点的值?

如何使用 Cloud Functions for Firebase 更新 Firebase 实时数据库中的值