繁体   English   中英

在Swift中处理时间后,如何关闭活动指标?

[英]How do you dismiss an activity indicator after processing time in Swift?

我有一个iOS Swift应用程序,它通过UIImagePicker使用相机和照片库功能。 用户可以从图库中选择照片或拍照,然后将其添加到我的图像阵列中。 但是,当用户选择要在选择器中使用的照片或按“使用照片”按钮时,我的应用程序将花费大约2秒钟来处理该照片,并且选择器直到那时才会消失。 因此,我想添加一个活动指示器,以使用户知道该图像已被选中并且正在处理中。 但是我不知道该怎么做。 我知道如何使用UIButtons显示和隐藏活动指示器,但是在完成处理时间后如何隐藏活动指示器?

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
    //Adds photo to image array
    //Takes a very long time to process.
    self.dismiss(animated: true, completion: nil)
}

对于用户而言, 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)
}

(假设在情节hidesWhenStopped设置了UIActivityIndicatorViewhidesWhenStopped设置,并将其连接到@IBOutlet activityIndicator 。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM