如何过滤获取的数据并加载到 tableview 中?

Posted

技术标签:

【中文标题】如何过滤获取的数据并加载到 tableview 中?【英文标题】:How can I filter my fetched data and load into tableview? 【发布时间】:2019-05-03 14:13:29 【问题描述】:

我正在使用 Firebase 数据库。我获取了数据,并希望仅过滤和显示与用户选择匹配的信息。

我使用了条件语句来查找匹配的值并附加列表,但是,我无法加载表。当我打印变量时,它打印 0。需要帮助,谢谢。

   override func viewDidLoad() 
    super.viewDidLoad()

    projectlbl.text = "Brand: \((repair?.brand)!) Model: \((repair?.modelNumber)!)"

    refResources = Database.database().reference().child("resources");


    let selectedProject = "\((repair?.modelNumber)!)"


    //observing the data changes
    refResources!.observe(DataEventType.value, with:  (snapshot) in
        //if the reference have some values
        if snapshot.childrenCount > 0 

            //clearing the list
            self.resourceList.removeAll()

            //iterating through all the values
            for resources in snapshot.children.allObjects as! [DataSnapshot] 
                //getting values
                let resourceObject = resources.value as? [String: AnyObject]
                let id  = resourceObject?["id"]
                let RSSSubCat  = resourceObject?["RSSSubCat"]
                let RSSBrand = resourceObject?["RSSBrand"]
                let RSSModelNumber = resourceObject?["RSSModelNumber"]
                let RSSTitle = resourceObject?["RSSTitle"]
                let RSSUrl = resourceObject?["RSSUrl"]

                //creating resource object with model and fetched values
                let resource = resourceModel(id: id as! String?, RSSSubCat: RSSSubCat as! String?, RSSBrand: RSSBrand as! String?, RSSModelNumber: RSSModelNumber as! String?, RSSTitle: RSSTitle as! String?, RSSUrl: RSSUrl as! String?)

                //appending it to list
                print(snapshot.childrenCount)

                if selectedProject == resource.RSSModelNumber 
                    print(selectedProject)
                    self.resourceList.append(resource)
                    self.diagResTable.reloadData()
                 else 
                    return
                

            

            //reloading the tableview
            self.diagResTable.reloadData()
        
    )

【问题讨论】:

您的错误是如果resources 的第一项与条件不匹配,它将以return 退出函数。而不是获取所有对象并过滤它们,而是使用谓词仅获取与谓词匹配的对象。 let selectedModelNumber = (self.refResources?.child("RSSModelNumber").queryEqual(toValue: selectedProject)) 我正在尝试实现这个谓词,但我不确定如何实现。我一直在梳理 firebase 文档,但我仍然感到困惑。 我不熟悉 Firebase,但每个严肃的数据库都提供通过谓词过滤的获取数据。 我知道了,谢谢您的意见! 【参考方案1】:

需要更改监听器...简单但被忽视。

       let selectedModelNumber = (self.refResources?.queryOrdered(byChild: "RSSModelNumber").queryEqual(toValue: selectedProject))


    //observing the data changes
    selectedModelNumber!.observe(DataEventType.value, with:  (snapshot) in

【讨论】:

以上是关于如何过滤获取的数据并加载到 tableview 中?的主要内容,如果未能解决你的问题,请参考以下文章

如何取消 Parse 获取数据请求

如何在tableview中搜索数据?

如何获取嵌套 JSON 值并将其加载到 Tableview Objective c 中?

如何将 tableview 行保存到文件并重新加载到 tableview

如何从其他类重新加载整个 tableview 控制器 [关闭]

过滤 json 数据并将结果数据重新加载到 myTableView