应用程序变量更改时触发 Firestore 查询

Posted

技术标签:

【中文标题】应用程序变量更改时触发 Firestore 查询【英文标题】:Trigger a Firestore Query when application variable changes 【发布时间】:2020-08-28 14:34:49 【问题描述】:

这可能是一个非常基本的问题,但我是 SwiftUI 和 Firestore 的新手,所以我有点挣扎。我正在构建一个显示我附近俱乐部位置的应用程序。我在 Firestore 中有我的 Clubs 集合,每个文档都有一个 geoPoint 和 geoHash。当我启动应用程序时,我使用位置管理器向我提供当前位置,然后我将其转换为 searchGeoHash 和 searchGeoBox,然后查询 Firestore,如下所示:

@Published var searchGeoHash: String = Geohash.encode(latitude: locationManager.location?.latitude ?? 0, longitude: locationManager.location?.longitude ?? 0, 5)
@Published var searchGeoBox: [String] = (Geohash.neighbors(String(searchGeoHash.prefix(4)))?.sorted())!

self.db.collection(K.Firebase.clubCollection)
    .whereField("clubActive", isEqualTo: true)
    .whereField("clubGeoHash", isGreaterThanOrEqualTo: searchGeoBox[0])
    .whereField("clubGeoHash", isLessThanOrEqualTo: searchGeoBox[7])
    .addSnapshotListener  querySnapshot, error in
        guard let documents = querySnapshot?.documents else 
            print("Error fetching Club documents: \(error!)")
            return
        
        self.clubList.removeAll(keepingCapacity: false)
        print("Club Count - from Firestore: ", documents.count)

        for doc in documents 
            let mappedDoc = Club(dictionary: doc.data())
            self.clubList.append(mappedDoc!)
        
        self.clubListCount = self.clubList.count
        print("Club Count - from Field: ", self.clubList.count)
    

这很有效,因为它显示了范围内的球杆。

我有另一个功能,允许用户更改他们的位置以搜索另一个位置的俱乐部。例如,我目前在波士顿,但我想搜索纽约的俱乐部。此函数更新 searchGeoHash 和 searchGeoBox

这个问题是我如何自动触发这个查询来更新,因为我已经改变了 searchGeoHash 和 searchGeoBox。

我必须重新运行查询还是以不同的方式使用 setup searchGeoHash 和 searchGeoBox?我应该使用 Observed 对象还是组合?

【问题讨论】:

我假设您只需要一个快照侦听器一次执行一个地理查询,对吧?换句话说,当用户改变位置时,该位置应该取代当前位置,是吗? 【参考方案1】:

我如何自动触发此查询以进行更新,因为我有 更改了 searchGeoHash 和 searchGeoBox。

你可以使用didSet:

@Published var searchGeoHash: String = Geohash.encode(...) 
    didSet 
        // trigger your query...
    

【讨论】:

以上是关于应用程序变量更改时触发 Firestore 查询的主要内容,如果未能解决你的问题,请参考以下文章

Cloud Firestore 中的每个数据更改都更新了局部变量

Firestore 查询变量以填充共享首选项

查询时如何在 Flutter (Dart) 中使用变量 Cloud Firestore

区分 Firestore 中的第一次查询快照和更改侦听器

Flutter - Provider 变量更改时触发导航

使用 ion-datetime 值更改更新 Firestore 文档