完成解析功能后在 TableView 中重新加载数据

Reloading Data in TableView after completing parse function

我正在尝试在函数完成后重新加载数据:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    if let presentingVC = presentingViewController as? DealsViewController {

 //checks if presenting VC's city is the same as original, doesn't run if it is      
 if presentingVC.city != self.currentCity {
        DispatchQueue.main.async {
            //reloads the data but before completion of the below function "getDealInfo"
            presentingVC.DealsTableView.reloadData()
            presentingVC.DealsTableView.layoutIfNeeded()
        }
    }
//checks if presenting VC's city is the same as original, doesn't run if it is        
if presentingVC.city != self.currentCity {
        presentingVC.city = self.currentCity
        presentingVC.deleteAllDeals()
        //this is the function that gets called
        presentingVC.getDealInfo()
        presentingVC.cityOutlet.setTitle(self.currentCity,for: .normal)
        }
       
    }
    tableView.deselectRow(at: indexPath, animated: true)
    searching = false
    self.dismiss(animated: true, completion: nil)
    searchBar.resignFirstResponder()
}

如您所见,我在返回前一个视图控制器以获取提供的新信息后调用了重新加载函数。但是,表视图会在接收到新值之前进行更新。结果,我的 tableView 是空的,但是我的值存储在我的数组中。

getDealInfo 是异步的:

    func getDealInfo() {
    let query = PFQuery(className: "Deal")
    query.whereKey("City", equalTo: city)
    query.order(byDescending: "Priority")
    query.findObjectsInBackground(block: { (objects: [PFObject]?,error: 
    Error?) in
    if let objects = objects {
        for object in objects {
            self.dealsArray.append(object["Deal"] as! String)
              }
            }
       }
    })
 }

那些是同步方法还是异步方法?如果它们是同步的,只需重新排序您的代码。我不知道为什么你有两次相同的 if 语句。只需将它组合成一个并在 运行 你的函数

之后调用重新加载数据
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    if let presentingVC = presentingViewController as? DealsViewController {
//checks if presenting VC's city is the same as original, doesn't run if it is        
if presentingVC.city != self.currentCity {
        presentingVC.city = self.currentCity
        presentingVC.deleteAllDeals()
        //this is the function that gets called
        presentingVC.getDealInfo()
        presentingVC.cityOutlet.setTitle(self.currentCity,for: .normal)
         DispatchQueue.main.async {
            //reloads the data but before completion of the below function "getDealInfo"
            presentingVC.DealsTableView.reloadData()
            presentingVC.DealsTableView.layoutIfNeeded()
        }
        }
       
    }
    tableView.deselectRow(at: indexPath, animated: true)
    searching = false
    self.dismiss(animated: true, completion: nil)
    searchBar.resignFirstResponder()
}

如果它们是异步的,那么您需要考虑提供某种完成块。但是不知道 presentingVC.getDealInfo() 是否是异步的,很难知道该建议什么。我觉得我们在这里遗漏了一些更重要的代码

将完成处理程序添加到 getDealInfo 以便在完成时收到通知:

func getDealInfo(_ completionHandler: @escaping () -> Void) {
    //Do async work
    completionHandler()
}

然后在调用代码中:

presentingVC.getDealInfo {
    self.presentingVC.DealsTableView.reloadData()
}

如果没有在主线程中调用完成处理程序,那么您想使用 DispatchQueue.main.async 就像您当前正在做的那样,对 reloadData 的调用是在主线程中完成的。