ios - 显示隐藏 View 真的很慢

标签 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 View 充当主要 View ,它可以启动和外部 View 来呈现最初隐藏的其他内容。

我遇到的问题是,我正在调用一个工作线程

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

最多可能需要 30 秒才能生效;然而,它的反转几乎是瞬时的。

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

有什么想法会导致这个问题吗?

谢谢!

最佳答案

@MobileMon 告诉您如何解决问题,但没有说明原因。

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

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

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

编辑:

为了清楚起见,您说:

The problem I'm running into, is that from a worker thread I'm calling

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

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

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

这样,您就可以从工作线程将 UI 代码分派(dispatch)回主线程。

您可能有其他代码试图在您不知情的情况下从后台线程执行 UIKit 调用。要检查,请添加以下行:

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

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

关于ios - 显示隐藏 View 真的很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38057233/

相关文章:

ios - 如果应用程序设备方向是纵向如何在 ios、swift 2.3 中仅为一个 View Controller 设置强制横向

swift - 当特征集合发生变化时,会出现约束冲突,就像 stackview 轴没有变化一样

ios - UIView切换过渡?

ios - 带有子 UIView(包含内容)的 UIScrollView 未检测到点击

Swift 通过 TCP 套接字发送十六进制数据

javascript - 从 Instruments Javascript 代码访问 native IOS 功能

ios - 如何从TextField中获取十进制值并在Objective C中进行计算

ios - 如何使用 Assets 目录作为导航栏背景图片?

ios - 在不改变边界的情况下在 UIView 中缩放图像?

ios - 删除核心数据对象并保存在后台线程中