【发布时间】:2019-02-04 21:59:03
【问题描述】:
我试图在用户点击某个 TabBar 项目时显示活动指示器。我认为,我的问题在于 UI 主线程被冻结。
当用户点击 TabBar 时,我准备了一个大约需要 6 秒的大数据列表。我让活动显示在任何地方,但是当他们点击 TabBar 时。
似乎指示器正在“运行”,因为当 segued uitableviewcontroller 显示时,它正在显示指示器。但这为时已晚,而且 dispatch 似乎也没有任何作用。
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,它阻塞了主线程上的所有内容。
【问题讨论】:
-
将指标代码放入目标视图控制器的 dispatchqueue.main.async { } 块中
-
我这样做了:编辑了我的问题
-
在视图中添加此代码确实加载视图控制器的方法,并在显示活动指示器后准备数据列表。
-
我们需要查看代码来了解数据是如何准备的。如果您在即将呈现的 viewController 的主队列上执行此操作,那么它将冻结 UI 直到它完成然后呈现(显示您的进度视图)
-
不要把dispatchqueue代码放在方法里把它放在viewcontroller viewdidload哪个标签栏打开它
标签: swift uitabbarcontroller uitabbar