如何计算使用 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 数据库中设置节点的值?