我正在尝试显示活动指示器,同时发生一些文本识别。如果我只是启动和停止[识别码周围的指示器,它永远不会显示。我遇到的问题是如果使用:
activityIndicator.startAnimating()
DispatchQueue.main.async( execute: {
self.performTextRecognition()
})
activityIndicator.stopAnimating()
self.performSegue(withIdentifier: "segueToMyBills", sender: self)
指示器从不显示,因为它执行segue并且下一个视图控制器中的表视图没有显示任何信息,因为文本识别尚未完成。到目前为止,我从未涉及线程,因此对于该做什么的一点了解将会非常感激。谢谢!
答案 0 :(得分:1)
你的问题是你的OCR发生在主线程上。这会阻塞线程,从而没有时间绘制活动指标。尝试将您的代码修改为:
activityIndicator.startAnimating()
DispatchQueue.global(qos: .background).async { [weak weaKSelf = self] in
// Use a weak reference to self here to make sure no retain cycle is created
weakSelf?.performTextRecognition()
DispatchQueue.main.async {
// Make sure weakSelf is still around
guard let weakSelf = weakSelf else { return }
weakSelf.activityIndicator.stopAnimating()
weakSelf.performSegue(withIdentifier: "segueToMyBills", sender: weakSelf)
}
}
答案 1 :(得分:0)
尝试以这种方式向self.performTextRecognition()函数添加完成处理程序
function performTextRecognition(completion: ((Error?) -> Void)? = .none) {
//you can replace Error with Any type or leave it nil
//do your logic here
completion?(error)
}
然后调用这个函数:
performTextRecognition(completion: { error in
activityIndicator.stopAnimating()
self.performSegue(withIdentifier: "segueToMyBills", sender: self)
})