一只简单的CoreData应用,UI界面左上角按钮触发一段耗时的代码,App本意是在执行耗时代码时将按钮暂时变为一个活动指示器,等到代码运行完毕再恢复原来的按钮.但是App运行时活动指示器从未显示过!
这是一个典型的主线程阻塞的情况,因为添加活动指示器是一个UI操作,所以它会被耗时操作阻塞,它会被执行,但没有效果(或者说结果未定义,在这里就是没有效果):
func handle(){ navigationItem.leftBarButtonItem = activityIndicatorBarButtonItem() //耗时的CoreData操作 self.navigationItem.leftBarButtonItem = self.exportBarButtonItem() }
我们下意识的做法是将耗时操作放到非main队列中去,like this:
func handle(){ navigationItem.leftBarButtonItem = activityIndicatorBarButtonItem() DispatchQueue.global().async { //耗时的CoreData操作 DispatchQueue