显示隐藏视图真的很慢

我有这样的设置:

self.webView = WKWebView(frame: frame, configuration: WKWebViewConfiguration()) self.externView = UIView(frame: frame) self.externWebView = WKWebView(frame: subFrame, configuration: WKWebViewConfiguration()) let StackView = UIStackView(frame: frame) self.externView?.addSubview(StackView) self.externView?.backgroundColor = UIColor.blackColor() view.addSubview(self.webView!) self.externView?.hidden = true StackView.addSubview(self.externWebView!) view.addSubview(self.externView!) 

这创建了我想要的初始设置,这允许1个Web视图充当主视图,可以启动,外部渲染其他内容,最初是隐藏的。

我遇到的问题是来自我正在调用的工作线程

 WKExteralLoader.externView!.hidden = false; WKExteralLoader.webView!.hidden = true; 

这可能需要30秒才能生效; 然而,它的倒数几乎是瞬间的。

 WKExteralLoader.webView!.hidden = false; WKExteralLoader.externView!.hidden = true; 

什么可能导致这个问题?

谢谢!

@MobileMon告诉你如何解决你的问题,但不是为什么。

UIKit不是线程安全的,这意味着必须从主线程进行所有UIKit调用。 设置视图的隐藏标志是UIKit调用,因此需要从主线程完成。

如果从后台线程操作UIView对象,则结果未定义。 大多数情况下,结果是需要很长时间才能使更改生效(你所看到的),但有时根本不会发生变化,有时结果是奇怪的视觉效果,有时你的应用程序会崩溃。

无论何时从后台线程操作UIView对象,都需要将其包装在对dispatch_async(dispatch_get_main_queue())的调用中,就像在MobileMon的回答中一样(或者其他一些导致代码从主线程运行的方法,但这是首选方式。)

编辑:

要说清楚,你说:

我遇到的问题是来自我正在调用的工作线程

WKExteralLoader.externView!.hidden = false; WKExteralLoader.webView!.hidden = true;

您无法从工作线程执行UI代码。 相反,你需要像这样编写代码:

 dispatch_async(dispatch_get_main_queue(), ^{ WKExteralLoader.externView!.hidden = false; WKExteralLoader.webView!.hidden = true; }); 

这样,从您的工作线程中,您将UI代码发送回主线程。

当您不知道它时,您可能有其他代码尝试从后台线程执行UIKit调用。 要检查,请添加以下行:

 print("isMainThread = \(Thread.current.isMainThread)") 

然后检查控制台中的打印内容。

在UI线程上运行隐藏/显示代码

  dispatch_async(dispatch_get_main_queue()) { WKExteralLoader.webView!.hidden = false; WKExteralLoader.externView!.hidden = true; } 

斯威夫特3:

 DispatchQueue.global(qos: .background).async { DispatchQueue.main.async { // enter code here } }