当前位置:  开发笔记 > 编程语言 > 正文

performSelectorOnMainThread的低级执行细节:

如何解决《performSelectorOnMainThread的低级执行细节:》经验,为你挑选了1个好方法。

不知道是否有人知道,或有指向好的文档,讨论,可可的低层次的实现细节"performSelectorOnMainThread:"方法.

我最好的猜测,我认为可能非常接近,是它使用马赫端口或它们之上的抽象来提供线程内通信,将选择器信息作为mach消息的一部分传递.

对?错误?谢谢!

更新09:39 AMPST

感谢Evan DiBiase和Mecki的答案,但澄清一下:我理解运行循环中会发生什么,但我正在寻找答案的是; " 其中在方法得到排队?如何被选择器信息获取传递到队列?" 寻找超过Apple的文档信息:我读过他们

更新14:21PST

Chris Hanson在评论中提出了一个很好的观点:我的目标不是学习底层机制,以便在我自己的代码中利用它们.相反,我只是对更好地概念性地理解另一个线程执行代码的过程感兴趣.正如我所说的,我自己的研究使我相信,它的花费马赫通讯的优势,为IPC线程之间传递信息的选择,但我专门找了混凝土上发生了什么信息,所以我可以肯定我的理解事情正确.谢谢!

更新03/06/09

我已经开启了这个问题的赏金,因为我真的希望看到它得到回答,但如果你想收集请确保你阅读所有内容,包括所有当前提出的答案,对这些答案的评论和我原来的问题,以及我上面发布的更新文本.我正在寻找所用机制的最低级细节performSelectorOnMainThread:,正如我前面提到的,我怀疑它与Mach端口有关,但我真的很想知道.除非我能确认给出的答案是正确的,否则不会颁发赏金.感谢大家!



1> Tony..:

是的,它确实使用了Mach端口.这是怎么回事:

    封装执行信息的数据块(目标对象,选择器,选择器的可选对象参数等)在线程的运行循环信息中排队.这是使用@synchronized最终使用的pthread_mutex_lock.

    调用CFRunLoopSourceSignal以表示源已准备好触发.

    调用CFRunLoopWakeUp让主线程的运行循环知道是时候唤醒.这是使用mach_msg完成的.

来自Apple文档:

版本1源由运行循环和内核管理.这些信号源使用马赫端口在信号源准备好发射时发出信号.当消息到达源的Mach端口时,内核会自动发信号通知源.当触发源时,消息的内容将被提供给要处理的源.CFMachPort和CFMessagePort的运行循环源目前实现为版本1源.

我现在正在查看堆栈跟踪,这就是它显示的内容:

0 mach_msg
1 CFRunLoopWakeUp
2 -[NSThread _nq:]
3 -[NSObject(NSThreadPerformAdditions) performSelector:onThread:withObject:waitUntilDone:modes:]
4 -[NSObject(NSThreadPerformAdditions) performSelectorOnMainThread:withObject:waitUntilDone:]

在mach_msg上设置断点,您就可以确认它.

推荐阅读
手机用户2402852387
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有