Swift/GeoFire:无搜索结果时提示逻辑的处理位置疑问
嘿,我来帮你理清楚这个无结果提示逻辑该放哪儿~结合你给出的GeoFire查询代码,有几个非常合适的位置,我给你拆解下:
1. 放在GeoFire查询的
observeReady回调中(核心位置) GeoFire的observeReady会在所有初始匹配地理位置的商品都被遍历完成后触发,这时候我们可以判断是否有任何商品被找到,是最适合放无结果提示的地方。
你可以给函数加一个onNoResults的回调参数,然后在observeReady里检查是否有结果:
func observeProducts(at: CLLocation, radius: Double, limitTo: UInt, priceMin: Double, priceMax: Double, onSuccess: @escaping (Product_) -> Void, onFailure: @escaping () -> Void, onNoResults: @escaping () -> Void) { let geoFire = GeoFire(firebaseRef: self.PRODUCTS_GEOFIRE_REF) let gfQuery = geoFire.query(at: at, withRadius: radius) // 标记是否找到过符合位置条件的商品 var hasFoundProducts = false // 监听每个匹配位置的商品key gfQuery.observe(.keyEntered) { key, location in hasFoundProducts = true // 这里根据key去获取Product_数据,然后调用onSuccess // 示例:self.fetchProduct(withKey: key, completion: onSuccess) } // 初始位置查询完成后触发 gfQuery.observeReady { if !hasFoundProducts { // 没有找到任何符合位置条件的商品,触发无结果提示 onNoResults() } } // 处理查询失败的情况 gfQuery.observe(.error) { _ in onFailure() } }
调用这个函数时,你就可以在onNoResults里写UI层的提示逻辑,比如显示“附近没有商品哦”的空状态页面。
2. 结合价格筛选的二次判断
因为你的函数里还有priceMin和priceMax的筛选条件,GeoFire只负责地理位置筛选,价格过滤是后续的逻辑。这时候要注意:可能有符合位置的商品,但全部不符合价格条件,这也需要触发无结果提示。
可以在初始查询完成后,统计符合价格条件的商品数量:
func observeProducts(at: CLLocation, radius: Double, limitTo: UInt, priceMin: Double, priceMax: Double, onSuccess: @escaping (Product_) -> Void, onFailure: @escaping () -> Void, onNoResults: @escaping () -> Void) { let geoFire = GeoFire(firebaseRef: self.PRODUCTS_GEOFIRE_REF) let gfQuery = geoFire.query(at: at, withRadius: radius) var matchingProductCount = 0 gfQuery.observe(.keyEntered) { key, location in self.fetchProduct(withKey: key) { product in // 检查价格是否符合筛选条件 if product.price >= priceMin && product.price <= priceMax { matchingProductCount += 1 onSuccess(product) } } onFailure: { // 处理单个商品获取失败的情况 } } gfQuery.observeReady { // 初始查询完成后,检查是否有符合所有条件的商品 if matchingProductCount == 0 { onNoResults() } } }
这样不管是位置没匹配到,还是位置匹配到但价格不符合,都能准确触发无结果提示。
3. 筛选条件变更时的前置处理
如果用户频繁调整半径、位置或价格范围,每次发起新查询前,建议先清空之前的商品列表,然后在新查询的observeReady回调里判断是否有结果。这样用户每次调整筛选条件后,都能及时得到反馈,不会看到旧的结果残留。
总结
最核心的触发点就是observeReady回调——它标志着当前筛选条件下的初始查询完成,结合位置和价格的双重判断,就能准确触发无结果提示逻辑。把提示逻辑放在业务层的onNoResults回调里,还能让数据层和UI层解耦,代码更清晰~
内容的提问来源于stack exchange,提问作者Mohamed Mohamed
相关产品推荐
相关产品推荐

