我有一个iOS Swift应用程序,它使用UIImagePicker的相机和照片库功能。用户可以从库中选择照片或拍照,然后将照片添加到我的图像阵列中。但是,当用户选择他们想要在选择器中使用的照片或按下“使用照片”按钮时,我的应用程序大约需要2秒钟来处理该照片,并且选择器在此之前不会被忽略。所以我想添加一个活动指示器,让用户知道图像已被选中并正在进行处理。但我不知道该怎么做。我知道如何使用UIButton显示和隐藏活动指示器,但是如何在处理时间结束后隐藏活动指示器?
return
答案 0 :(得分:1)
对于用户来说, 2秒有点长,而对于iOS系统来说, 2秒太长了太长时间没有占用主线程。
无论您是否要显示活动指示器,都不应在主线程中调用这样一个耗时的任务。在后台线程中执行此操作也需要正确更新UI元素(包括show / hide / animate UIActivityIndicatorView
)。
您的代码会变成这样:
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
DispatchQueue.global(qos: .userInitiated).async {
DispatchQueue.main.async {
//UI updates needs to be done in the main thread
self.activityIndicator.startAnimating()
//Other UI updates & setups needed for mutual exclusion
}
//### In a background thread...
//Adds photo to image array
//Takes a very long time to process.
DispatchQueue.main.async {
//Reset mutual exclusion & restore UI state
self.activityIndicator.stopAnimating()
}
}
picker.dismiss(animated: true, completion: nil)
}
(假设在故事板中设置了UIActivityIndicatorView
并设置了hidesWhenStopped
并连接到@IBOutlet
activityIndicator
。)