显示隐藏视图真的很慢

时间:2016-06-27 14:58:19

标签: ios swift uiview

我有这样的设置:

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;

任何可能导致此问题的想法?

谢谢!

3 个答案:

答案 0 :(得分:4)

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

artisan

答案 1 :(得分:4)

@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)")

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

答案 2 :(得分:3)

斯威夫特3:

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