使用OCR显示活动指示符并使用线程

时间:2017-01-17 23:57:59

标签: swift swift3

我正在尝试显示活动指示器,同时发生一些文本识别。如果我只是启动和停止[识别码周围的指示器,它永远不会显示。我遇到的问题是如果使用:

activityIndicator.startAnimating()
DispatchQueue.main.async( execute: {
     self.performTextRecognition()
})
activityIndicator.stopAnimating()
self.performSegue(withIdentifier: "segueToMyBills", sender: self)

指示器从不显示,因为它执行segue并且下一个视图控制器中的表视图没有显示任何信息,因为文本识别尚未完成。到目前为止,我从未涉及线程,因此对于该做什么的一点了解将会非常感激。谢谢!

2 个答案:

答案 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)
  })