当呈现来自其他 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
更安全并且不会造成任何开销,直到您连续调用此方法一百万次。
我试图通过将 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
在我看来,您应该从方法中删除调度队列。
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
更安全并且不会造成任何开销,直到您连续调用此方法一百万次。