显示隐藏视图真的很慢
我有这样的设置:
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 } }