【问题标题】:Must Webkit always be used on the main thread?必须始终在主线程上使用 Webkit 吗?
【发布时间】:2012-05-11 16:42:50
【问题描述】:

我正在尝试在后台渲染网页,但遇到了以下问题

2012-05-11 12:39:02.086 [77207:1c03] An uncaught exception was raised
2012-05-11 12:39:02.087 [77207:1c03] objc_object* -[WebView initWithFrame:frameName:groupName:](WebView*, objc_selector*, CGRect, NSString*, NSString*) was called from a secondary thread

我知道 webkit 类不是线程安全的,但它们是否也必须始终在主线程中使用?或者,我可以创建一个虚拟 Web 视图来初始化 webkit,然后在后台线程中使用 webkit 类吗?

【问题讨论】:

  • @Jeremy1026 该帖子涉及 UIWebView,而不是 WebView。
  • WebViews 异步加载。您希望通过将其转移到后台线程来获得什么?
  • @Tony 你真的找到解决方法了吗?
  • 我解决了这个问题,而不是真正解决它。如果我需要进行处理,我会在后台进程中初始化 webkit,否则似乎没有办法从后台线程中使用它。

标签: multithreading cocoa webkit


【解决方案1】:

WebViewNSView 的子类。来自Threading Programming Guide

NSView 类通常是线程安全的,但有一些例外。 你 应该创建、销毁、调整大小、移动和执行其他操作 NSView 对象仅来自应用程序的主线程。 绘图 只要你括号绘图,从辅助线程是线程安全的 调用 lockFocusIfCanDraw 和 unlockFocus。

(已添加重点。)

我不太清楚 AppKit WebView 是如何工作的,但我的理解是,在 UIKit 中实际上只有一个 UIWebView 出于性能原因而被重新使用,类似于 AppKit 中的字段编辑器.如果我的理解是正确的,并且 WebView 的行为类似,我可以看到您在后台线程方面遇到了更大的问题。

【讨论】:

  • 是的,看起来在后台执行 webkit 工作最好在单独的进程而不是单独的线程中完成。你知道是否可以预加载网页而不在后台渲染?这样一来,一个网络视图就可以进行渲染,但网络请求仍然可以并发。
  • 老实说,我对 AppKit WebView 并没有那么熟练,但最坏的情况是你可以使用 NSHTTPURLConnection 异步下载页面,然后将内容加载到 WebView 中,例如 -[WebFrame loadHTMLString:baseURL :]。
  • @Tony - 你可以使用多个 web 视图,将页面预加载到当前不可见的页面中 - 想想 Safari 选项卡。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-13
  • 1970-01-01
  • 2015-12-28
相关资源
最近更新 更多