【问题标题】:osx multithreading and webviewsosx 多线程和 webviews
【发布时间】:2015-11-03 12:50:22
【问题描述】:

我不是应用程序开发人员,所以这可能很容易回答。

我有一个显示简单 HTML 页面的 webview。最重要的是,我有一个从 Objective-c 到 javascript 的简单新娘,因此我可以在 HTML 页面和应用程序之间发送消息。

在 HTML 页面中有一个按钮,当您单击它时,会向 Objective-c 发送一条消息,该消息会启动一个 NSTimer。计时器每 300 毫秒调用一次函数。该函数通过objective-c to javascript桥向HTML页面发送一个随机数。

这个函数应该做一些繁重的处理,然后将结果发送回 HTML 页面。这个函数需要尽可能多的“权力”。

我的问题很简单,我是否需要创建一个单独的线程来处理工作和发布,或者这不是问题,因为通信是到 web 视图中的 HTML 页面?

如果我需要单独的线程,请指出我可以了解的正确方向。

【问题讨论】:

    标签: javascript html objective-c multithreading webview


    【解决方案1】:

    简短回答:是的,您应该将繁重的处理放在主线程之外。
    您可以使用:

    [self performSelectorOnMainThread:@selector(heavyProcessing:) withObject:@"Argument" waitUntilDone:NO];
    

    或使用 GCD。检查这个How do I create a NSTimer on a background thread?

    如果您真的想了解使用什么以及为什么使用,请阅读本文 Concurrency Programming Guide

    长答案: 这取决于。如果你的 HTML 有动画,或者它允许交互(比如用户可以按下按钮并发生一些事情),WebView 将在繁重的处理完成时冻结。但是,如果 WebView 的内容始终是相同的,并且只有在繁重的过程完成后才更新,那么差异不会很明显。 (也许鼠标图标一直在旋转)。

    【讨论】:

    • 感谢您的回答和链接,真的很有帮助。最终使用了 dispatch_async、dispatch_get_main_queue 和 detachNewThreadSelector。
    • @tbleckert 很高兴它有帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-18
    • 1970-01-01
    • 2017-11-02
    • 2016-07-22
    • 1970-01-01
    • 2017-05-21
    相关资源
    最近更新 更多