在Swift处理时间之后如何解除活动指标?

时间:2017-07-13 20:36:16

标签: ios swift uiactivityindicatorview activity-indicator

我有一个iOS Swift应用程序,它使用UIImagePicker的相机和照片库功能。用户可以从库中选择照片或拍照,然后将照片添加到我的图像阵列中。但是,当用户选择他们想要在选择器中使用的照片或按下“使用照片”按钮时,我的应用程序大约需要2秒钟来处理该照片,并且选择器在此之前不会被忽略。所以我想添加一个活动指示器,让用户知道图像已被选中并正在进行处理。但我不知道该怎么做。我知道如何使用UIButton显示和隐藏活动指示器,但是如何在处理时间结束后隐藏活动指示器?

return

1 个答案:

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