当呈现来自其他 ViewController 的 ViewController 时,我是否需要调用 DispatchQueue

Do I need to call DispatchQueue when presenting a ViewController from other ViewControllers

我试图通过将 UIActivityViewController 包含在助手 class 中来在我的应用程序的多个部分中呈现它。以下代码工作正常,我可以从我的应用程序中的任何其他视图控制器调用 showActivityController() 方法,并且 UIActivityViewController 会按预期显示。

我的问题是,我是否真的需要将 UIActivityViewController 包含在 DispatchQueue.main.async 中,如下所示?

我在没有它的情况下尝试过它并且工作正常,但我想确保将它留在那里不会在以后造成任何问题。

class HelperClass: UIViewController, UIActivityItemSource{
    static let shared = HelperClass()

    func showActivityController(){
        DispatchQueue.main.async {
            let items = [self]
            let activityController = UIActivityViewController(activityItems: items, applicationActivities: nil)
            UIApplication.shared.keyWindow?.rootViewController?.present(activityController, animated: true)
        }
    }

    func activityViewControllerPlaceholderItem(_ activityViewController: UIActivityViewController) -> Any {
        return "Return Type"
    }

    func activityViewController(_ activityViewController: UIActivityViewController, itemForActivityType activityType: UIActivity.ActivityType?) -> Any? {
        if activityType == .message{
            return "Text for iMessage"
        }else if activityType == .mail{
            return "Text for Email" 
        }else{
            return "Text for all other apps"
        }
    }
    func activityViewController(_ activityViewController: UIActivityViewController, subjectForActivityType activityType: UIActivity.ActivityType?) -> String {
        return "Email Subject"
    }
}

来自其他视图控制器的用法

HelperClass.shared.showActivityController()

仅在主线程中时不需要。所以写 DispatchQueue 是多余的

但是,如果您想从另一个线程进行演示,则必须使用 DispathchQueue

来演示 UI

假设,您正在进行网络呼叫,并且在网络呼叫完成后您必须显示 UI

在我看来,您应该从方法中删除调度队列。

func showActivityController(){
         let items = [self]
            let activityController = UIActivityViewController(activityItems: items, applicationActivities: nil)
            UIApplication.shared.keyWindow?.rootViewController?.present(activityController, animated: true)
    }

但是当你必须从其他线程呈现UI时,只需调用主线程中的方法

DispatchQueue.main.async {
    HelperClass.shared.showActivityController()   
}

最好将所有与接口相关的代码保留在主线程中,所以我将其保留在 DispatchQueue.main.async 中,因为在某些时候您可以从在后台线程上执行的闭包中调用 showActivityController()导致 运行时错误 。调用 DispatchQueue.main.async 更安全并且不会造成任何开销,直到您连续调用此方法一百万次。