我试图在用户点击某个TabBar项目时显示活动指示器。我认为我的问题在于UI Main线程被冻结。
当用户点击TabBar时,我准备了一个大约需要六秒钟的大数据列表。我可以将活动显示在所有地方,但是当他们点击TabBar时。
该指示器似乎正在“运行”,因为当已定名的uitableviewcontroller显示时,它正在显示该指示器。但这为时已晚,调度似乎也无能为力。
func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
if let visibleViewCtrl = UIApplication.shared.keyWindow?.visibleViewController {
// do whatever you want with your `visibleViewCtrl`
print (String.init(describing: visibleViewCtrl.classForCoder))
DispatchQueue.main.async{
let aprogressView = ProgressView(Message: "Filtering...",
Theme:.Dark,
IsModal:true);
visibleViewCtrl.view.addSubview(aprogressView)
aprogressView.show()
}
}
return true
}
好,所以问题在于它要转到一个tableview控制器,该控制器试图几乎立即获取该节中的行,然后首先执行fetchrequest来阻塞主线程中的所有内容。
答案 0 :(得分:0)
已解决:
添加了一个布尔值:
var loadData = false
override func viewDidAppear(_ animated: Bool) {
loadData = true
self.tableView.reloadData()
}
然后代表们:
func sectionIndexTitles(for tableView: UITableView) -> [String]? {
if loadData == false {
return nil
}
return searchFetchedResultsController.sectionIndexTitles
}
func numberOfSections(in tableView: UITableView) -> Int {
if loadData == false {
return 0
}
现在它将立即过渡到新控制器,因此我现在可以显示来自viewWillAppear的反馈:
appDelegate.progressView = ProgressView(Message: "Filtering Brands", Theme:.Dark, IsModal:true);
appDelegate.progressView!.show()
这将不用于程序化展示
self.navigationController?.pushViewController(vc, animated: false)