gpt4 book ai didi

multithreading - 为什么执行选择器:onThread: is not good?

转载 作者:行者123 更新时间:2023-12-03 16:45:50 26 4
gpt4 key购买 nike

刚刚在 Apple docs: 中找到

Note: Although good for occasional communication between threads, you should not use the performSelector:onThread:withObject:waitUntilDone: method for time critical or frequent communication between threads.

为什么会这样呢? “频繁”是多少?

我的应用程序有很多线程,并且主线程中发生了很多事情(大量 JavaScript、WebKit 中频繁的 Ajax 查询)。在 Yosemite 上,我开始在多个(例如 10 个)文件下载 (NSURLDownloads) 和 WebKit GUI(需要在主线程中运行)的组合中遇到巨大的问题。

在 JavaScript 负载严重的 WebKit 中,文件下载无法“存活”很长时间。在某些时候,所有网络请求开始返回超时(错误-1001),直到应用程序退出。

我广泛使用performSelector:onThread:withObject:waitUntilDone:,例如通知 UI 有关下载进度的信息。这种情况每秒可能发生多次。这会是问题所在吗?

附注不幸的是,我不被允许展示整个源代码......

最佳答案

奇怪的是,在 Yosemite 文档上,NSObject 的文档中没有这样的警告...

虽然也许只有苹果公司才能给出真正的原因,但我怀疑这与性能有关。请注意 NSObject 中该调用的文档中的这一段:

This method queues the message on the run loop of the target thread using the default run loop modes—that is, the modes associated with the NSRunLoopCommonModes constant. As part of its normal run loop processing, the target thread dequeues the message (assuming it is running in one of the default run loop modes) and invokes the desired method.

换句话说,当您使用该方法时,您将在系统上的不同线程上传递对象,并且此过程中可能会产生一些开销。系统仅保证它将直接由目标线程执行 - 它没有说明何时它将被执行。如果目标线程已经在做某事,则您的方法可能有一段时间不会被调用。因此,最好向线程发送消息(即更新标志或其他内容),而不是立即运行某些内容,因为与所有具有线程的事物一样,无法保证立即执行。

总而言之,出现警告可能有两个原因:

  • 这样做会产生一些开销,因此不利于发送快速消息
  • 不保证该方法何时执行;这完全取决于 CPU 调度程序何时为线程提供执行时间以及发生这种情况时线程正在做什么

关于multithreading - 为什么执行选择器:onThread: is not good?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27760911/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com