为什么performSelector:onThread:不好?

时间:2015-01-03 23:57:37

标签: multithreading cocoa

刚刚在Apple docs:

中找到
  

注意:虽然适合线程之间的偶然通信,但您不应该使用performSelector:onThread:withObject:waitUntilDone:方法进行线程之间的时间关键或频繁通信。

为什么会这样?经常"多少钱?#/ p>

我有一个带有很多线程的应用程序,并且在主线程中发生了很多事情(繁重的JavaScript,WebKit中频繁的Ajax查询)。在优胜美地,我开始遇到很多问题,包括几个(比方说,10个)文件下载(NSURLDownload s)和WebKit GUI(需要在主线程中运行)。

文件下载不能"直播"很长一段时间,由JavaScript重载的WebKit。在某些时候,所有网络请求都会开始返回超时(错误-1001),直到应用程序退出。

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

P.S。不幸的是,我不允许显示整个源代码......

1 个答案:

答案 0 :(得分:0)

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

虽然也许只有Apple可以说出真正的理由,但我怀疑它与性能有关。请注意NSObject中该调用的文档中的此段落:

  

此方法使用默认的运行循环模式(即与NSRunLoopCommonModes常量关联的模式)在目标线程的运行循环上对消息进行排队。作为其正常运行循环处理的一部分,目标线程使消息出列(假设它在一个默认的运行循环模式下运行)并调用所需的方法。

换句话说,当您使用该方法时,您将在系统上的不同线程上传递对象,并且此过程中可能存在一些开销。系统只保证它将由目标线程直接执行 - 它执行时不会说。如果目标线程已经在执行某些操作,则可能暂时不会调用您的方法。因此,最好将消息发送到线程(即更新标志或其他内容)而不是立即运行,因为像所有线程一样,不能保证立即执行。

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

  • 这样做有一些开销,所以发送快速消息不好
  • 无法保证何时执行该方法;这一切都取决于CPU调度程序何时给出线程执行时间以及当发生这种情况时线程正在做什么