首页 > 解决方案 > Firestore 查询不返回基于 searchText 的数据

问题描述

我的 searchBar 文本正在更新我的查询,但没有像我预期的那样从 Firestore 返回数据。

这是我的数据模型中的方法:

func getMealPlans(starred starredOnly:Bool = false, textToQuery searchText:String = "") {
        
        listener?.remove()

        let db = Firestore.firestore()
        
        var query:Query = db.collection("mealPlans")
           
        query = query.whereField("title", isGreaterThanOrEqualTo: searchText)
        
        func queryData() {
            
            self.listener = query.addSnapshotListener({ (snapshot, error) in
                
                // Check for errors
                if error == nil && snapshot != nil {
                    
                    var mealPlans = [MealPlan]()
                    
                    // Parse documents into mealPlans
                    for doc in snapshot!.documents {
                        
                        let m = MealPlan(
                            docID: doc["docID"] as? String,
                            title: doc["title"] as! String)
                        
                        mealPlans.append(m)
                    }
                    // Call the delegate and pass back the notes in the main thread
                    DispatchQueue.main.async {
                        self.delegate?.mealPlansRetrieved(mealPlans: mealPlans)
                    }
                }
            })
        }

        queryData()   
    }

这是我的视图控制器中的搜索栏方法:

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {

        let searchedText = searchText.lowercased()
        model.getMealPlans(textToQuery: searchedText)
        
        self.tableView.reloadData()
    }

我想知道query = query.whereField("title", isGreaterThanOrEqualTo: searchText)我的模型中是否可能是我问题的根源。当我print(searchText)在此代码之后searchText,我键入的内容按预期显示在控制台中。但是表格视图不会随着具有匹配 title的单元格更新,即使它是完全匹配的。

标签: iosswiftfirebasegoogle-cloud-firestoreuisearchbar

解决方案


 You need to use document data property to load MealPlan. Better make it the following way:
    
    1. Define data model as Codable:

import Foundation
import FirebaseFirestore
import FirebaseFirestoreSwift
            
struct MealPlan: Codable {
    @DocumentID var id: String?
    title: String?
}

2. Then use compact map to get mealPlans:

mealPlans = snapshot.documents.compactMap { document -> MealPlan? in
     do {
         let result = try document.data(as: MealPlan.self)
         return result
     }
     catch {
         print(error)
         return nil
     }
}

推荐阅读