刚刚在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。不幸的是,我不允许显示整个源代码......
答案 0 :(得分:0)
奇怪的是,在Yosemite文档中,NSObject
的文档中没有这样的警告......
虽然也许只有Apple可以说出真正的理由,但我怀疑它与性能有关。请注意NSObject
中该调用的文档中的此段落:
此方法使用默认的运行循环模式(即与
NSRunLoopCommonModes
常量关联的模式)在目标线程的运行循环上对消息进行排队。作为其正常运行循环处理的一部分,目标线程使消息出列(假设它在一个默认的运行循环模式下运行)并调用所需的方法。
换句话说,当您使用该方法时,您将在系统上的不同线程上传递对象,并且此过程中可能存在一些开销。系统只保证它将由目标线程直接执行 - 它执行时不会说。如果目标线程已经在执行某些操作,则可能暂时不会调用您的方法。因此,最好将消息发送到线程(即更新标志或其他内容)而不是立即运行,因为像所有线程一样,不能保证立即执行。
总而言之,警告可能有两个原因: