Ios 试图使numberOfRowsInSection计数等于Swift中另一个文件的数组计数

Ios 试图使numberOfRowsInSection计数等于Swift中另一个文件的数组计数,ios,arrays,swift,uitableview,Ios,Arrays,Swift,Uitableview,目前,我正在从firebase获取数据,将数据转换为一个对象数组,并尝试将该数组计数作为“numberOfRowsInSection”的计数。 因此,我在声明数组的视图控制器上获得了正确的计数,但当我将数据传递给tableview控制器时,我一直得到0 下面我展示了viewcontroller,我在其中提取数据并将其放入过滤数组: func fetchAllData( completion: @escaping (_ call: [Restaurant]) -> Void) {

目前,我正在从firebase获取数据,将数据转换为一个对象数组,并尝试将该数组计数作为“numberOfRowsInSection”的计数。 因此,我在声明数组的视图控制器上获得了正确的计数,但当我将数据传递给tableview控制器时,我一直得到0

下面我展示了viewcontroller,我在其中提取数据并将其放入过滤数组:

 func fetchAllData( completion: @escaping (_ call: [Restaurant]) -> Void) {

    self.ref = Database.database().reference()
    self.ref?.observe(.value, with: { (snap) in
        guard let topArray = snap.value as? [[String:Any]] else {print(":(") ; return }
        var restaurantArray = [Restaurant]()

        for dictionary in topArray {
            self.restaurantGroup.enter()
            guard let address = dictionary["Address"] as? String,
                let city = dictionary["City"] as? String,
                let inspectionDate = dictionary["Inspection Date"] as? String,
                let name = dictionary["Name"] as? String,
                let major = dictionary["Number of Occurrences (Critical Violations)"] as? Int,
                let minor = dictionary["Number of Occurrences (Noncritical Violations)"] as? Int,
                let violationTitle = dictionary["Violation Title"] as? String else { continue }
            print(2)
            //MARK: - creates restaurants from the list above
            let restaurant = Restaurant(address: address, city: city, inspectionDate: inspectionDate, name: name, major: major, minor: minor, violationTitle: violationTitle)

            print(3)
            //MARK: - Adds a restaurant to restaurant array instance
            restaurantArray.append(restaurant)
        }
        self.restaurantList = restaurantArray
        self.restaurantGroup.leave()
        completion(self.restaurantList)

        let dictionaryNew = Dictionary(grouping: self.restaurantList) { $0.name + " " + $0.address}

        self.restaurantListModified = dictionaryNew
        print(self.restaurantListModified.count)
     })
     }

func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {

    var filteredArray = [[Restaurant]]()
    guard let userSearch = searchBar.text?.uppercased() else { return }
    pulleyViewController?.setDrawerPosition(position: .partiallyRevealed, animated: true)

    var nameArray = [String]()

    for (key, value) in restaurantListModified {

        if value[0].name.hasPrefix(userSearch.uppercased()){
            filteredArray.append(value)
        }
    }

    for subarray in filteredArray {
        let nameArrayForTBView = subarray[0].name
        nameArray.append(nameArrayForTBView)
    }
    self.tableViewNameArray = nameArray
    print("\(tableViewNameArray.count)I found the problem that @Kamran pointed to. I was not assigning  self.tableViewNameArray = nameArray. So I changed 

var tableViewNameArray to 
static var tableViewNameArray
func fetchAllData(完成:@escaping(u-call:[Restaurant])->Void){
self.ref=Database.Database().reference()
self.ref?.observe(.value,带:{(管理单元)}
guard let topArray=snap.value as?[[String:Any]]else{print(“:(”);return}
var restaurantArray=[餐厅]()
用于topArray中的字典{
self.restaurantGroup.enter()
guard let address=字典[“地址”]作为字符串,
将city=字典[“city”]设为?字符串,
将inspectionDate=字典[“检查日期”]设为?字符串,
将name=字典[“name”]设为?字符串,
让major=dictionary[“发生次数(严重违规)”]为?Int,
让minor=dictionary[“发生次数(非关键违规)”]为?Int,
让violationTitle=dictionary[“Violation Title”]作为字符串else{continue}
印刷品(2)
//MARK:-从上面的列表中创建餐厅
let restaurant=餐厅(地址:地址,城市:城市,检查日期:检查日期,姓名:姓名,专业:主要,次要:次要,违例标题:违例标题)
印刷品(3)
//MARK:-将餐厅添加到餐厅数组实例
餐厅附加(餐厅)
}
self.restaurantList=restaurantArray
self.restaurantGroup.leave()
完成(自助餐厅列表)
让dictionaryNew=Dictionary(分组:self.restaurantList){$0.name++$0.address}
self.restaurantListModified=dictionaryNew
打印(self.restaurantListModified.count)
})
}
func searchBar searchbutton单击(searchBar:UISearchBar){
var filteredArray=[[餐厅]]()
guard let userSearch=searchBar.text?.uppercased()else{return}
PulleryViewController?.SetDroperPosition(位置:。部分预览,动画:true)
变量nameArray=[String]()
对于restaurantListModified中的(键,值){
if值[0].name.hasPrefix(userSearch.uppercased()){
filteredArray.append(值)
}
}
用于FilterDarray中的子阵列{
让nameArrayForTBView=子阵列[0]。名称
nameArray.append(nameArrayForTBView)
}
self.tableViewNameArray=nameArray

print(“\(tableViewNameArray.count)我发现了@Kamran指出的问题。我没有分配self.tableViewNameArray=nameArray。所以我改变了


如果你是像我这样的编程新手,请确保阅读更多关于局部和全局变量的内容。这非常有用。

当新数据传递到tableview时,你实际上需要重新加载tableview。这是再次调用numberOfRowsInSection函数的唯一方法。因此,当你设置属性observer tableViewNameArray时,你需要调用tableview、 主线程中的reloadData()方法,以使用新数据再次触发进程。我将对其进行测试。我在tableview控制器上的观察者如下所示:NotificationCenter.default.addObserver(self,selector:#selector(reloadTableView),name:MapViewController.RestaurantNotification.notificationSet,object:nil)}我应该做些不同的事情吗?reloadTableView函数内部发生了什么?下面是函数:@objc func reloadTableView(){DispatchQueue.main.async{self.restaurantListTableView.reloadData()}}}你认为我应该关闭主异步吗?