2017-01-17 81 views
0

我試圖在發生某些文本識別時顯示活動指示器。如果我只是開始並停止[識別碼周圍的指示符,它從不顯示。我有問題是,如果使用:使用OCR和使用線程顯示活動指示器

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

的指示燈不顯示,因爲它執行的SEGUE並在接下來的視圖控制器的表視圖顯示任何信息,因爲文本識別尚未完成。到目前爲止,我從來沒有碰到過線程,所以對如何做的一點點了解將非常感激。謝謝!以這種方式

+0

嘗試包括所有主隊列 – John

+0

這個沒有工作內部操作,謝謝雖然 – Wazza

回答

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)     
    } 
} 
+0

令人驚歎的謝謝 – Wazza

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) 
    }) 
+0

此工作處理不當我怕。 – Wazza