PerformSelectorOnMainThread 实现的底层细节:

2024-03-26

想知道是否有人知道或有指向讨论 Cocoa 的“performSelectorOnMainThread:”方法的低级实现细节的良好文档。

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

正确的?错误的?

更新时间 09:39 AMST

感谢 Evan DiBiase 和 Mecki 的回答,但需要澄清一下:我理解运行循环中发生的情况,但我正在寻找的答案是; ”where该方法是否正在排队?how选择器信息是否被传递到队列中?” 寻找的不仅仅是苹果的文档信息:我已经阅读了它们

太平洋标准时间 14:21 更新

Chris Hanson 在评论中提出了一个很好的观点:我的目标不是学习底层机制以便在我自己的代码中利用它们。相反,我只是想更好地概念性地理解向另一个线程发送信号以执行代码的过程。正如我所说,我自己的研究使我相信它利用 IPC 的马赫消息传递在线程之间传递选择器信息,但我专门寻找concrete有关正在发生的事情的信息,因此我可以确定我理解事情正确地。谢谢!

更新 03/06/09

我正在寻找最低级别的细节所使用的机制performSelectorOnMainThread:等等,正如我之前提到的,我怀疑这与马赫端口有关,但我真的很想确定。


是的,它确实使用 Mach 端口。发生的事情是这样的:

  1. 封装执行信息(目标对象、选择器、选择器的可选对象参数等)的数据块在线程的运行循环信息中排队。这是使用完成的@synchronized,最终使用pthread_mutex_lock.
  2. CFRunLoop Source Signal 被调用以发出信号源已准备好触发。
  3. 调用 CFRunLoopWakeUp 是为了让主线程的运行循环知道是时候醒来了。这是使用 mach_msg 完成的。

来自苹果文档:

版本 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 上设置断点,您就可以确认它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PerformSelectorOnMainThread 实现的底层细节: 的相关文章

  • Xcode 4:获取请求模板变量?

    在 Xcode 3 X 中 您应该右键单击获取请求模板的谓词编辑器中的空白来指定变量输入而不是硬编码谓词 这是 XCode 4 中的哪里 我已经按住了选项 右键单击 选项单击等 但无法弄清楚 我认为X4不再有变量了 相反 我认为您必须选择一
  • iOS图片上的线测量

    我需要一些帮助来开始绘制末端带有圆圈的线条 并测量其长度 我能够划清界限 但无法让它移动 花了几个小时决定在 SO 上发布 因此 请参阅下图并指导我开始 任何使用 Objective C 的示例或教程都会有帮助 谢谢 这个想法看起来实现起来
  • Objective-C 字符串文字的预处理器宏值

    我在构建设置中定义了一个预处理器宏 FOO BAR 我想将该值转换为可以传递给方法的 Objective C 字符串文字 以下 define 不起作用 但它应该展示我想要实现的目标 define FOOLITERAL FOO want FO
  • WebView 不运行 loadHTMLString 中给出的 JavaScript

    我不明白为什么这不起作用 我的桌面上有一个 test htm 文件 如下所示 This is x 2 我有一个 WebVie
  • 多次显示admob插页式广告怎么办?

    我有一个小型游戏应用程序 它有一个故事板 里面创建了像开始菜单 游戏区域 分数这样的场景 我在其中添加了 admob 横幅视图和插页式广告 我的横幅视图工作正常 但我的插页式广告只能工作一次 我在 viewdidload 上加载插页式广告
  • 如何使用编译时间作为自动版本控制信息?

    当程序被编译以获得一种自动版本信息时 是否有任何常量或 pragma来获取时间和日期 DATE and TIME 是预定义的宏 将分别扩展到当前日期和时间
  • NSString 上的 stringWithFormat 与 initWithFormat

    我想知道以这种方式声明 NSString 有什么区别 例如缺点和 或优点 NSString noInit NSString stringWithFormat lolcatz d i 与以下相反 NSString withInit NSStr
  • UITableViewCell 内的 UIPageViewController

    嘿我想问如何在 UITableViewCell 内实现 UIPageViewController 我一直在阅读周围的内容 但到目前为止似乎对任何尝试的人都不起作用 我希望得到一些提示 不需要完整的答案 谢谢 目前还不清楚你到底想做什么 但让
  • 将 CFIndex 转换为 NSUInteger?

    我如何转换typedef signed long CFIndex to typedef unsigned int NSUInteger 如果我使用一个可以吗 CFIndex作为类型的参数NSUInteger 我还没有铸造它 编译者似乎也不介
  • 子视图的子层与更高的子视图重叠

    我有一个问题 我正在创建一个UIView这是从方法返回的 这部分很好 但我注意到 当我将子层添加到其中一个子视图时 这些层与子层添加的层次结构中较高的子视图 textView 和 imageView 重叠到testViewCopy出现在这些
  • 每个 CPU 核心处于 C0 电源状态的时间

    任何帮助弄清楚如何做到这一点都会很棒 在过去一秒内 每个 CPU 核心处于 C0 电源状态的时间有多少 这是针对 Mac 应用程序的 因此需要 Objective C cocoa 和 c OS X 没有任何公开 CPU c 状态的 API
  • 小视频播放

    根据我从互联网收集的信息 MPMoviePlayerController 类不支持小视频播放 因此 为了死马当活马医 我想知道可以使用什么样的方法来让小视频在屏幕的一角播放 而不中断屏幕的其余部分 到目前为止 我们已经遇到了两种可行的解决方
  • 方法调用中的插入符[重复]

    这个问题在这里已经有答案了 我正在阅读本教程 并遇到了这行代码 这让我感到困惑 localSearch startWithCompletionHandler MKLocalSearchResponse response NSError er
  • 将 Xcode 4.5 新 XIB 文件恢复到 iOS<6

    我已经安装了Xcode 4 5 with iOS6 SDK以及其他用于测试目的的旧 SDK 从 4 3 到 6 0 很美 但是有一个BIG问题 生成一个新的 XIB 文件以兼容 iOS6 这是一个问题 因为我的应用程序需要运行在旧设备 不只
  • 使用 Swift 创建 NSAlert

    我有在 Objective C 中创建和 NSAlert 的代码 但我现在想在 Swift 中创建它 该警报旨在确认用户想要删除文档 我想要 删除 按钮来运行删除功能 而 取消 按钮只是为了消除警报 我怎样才能用 Swift 写这个 NSA
  • 通过应用程序组在应用程序之间通信和保存数据

    iOS 8 昨天发布了一个有关应用程序组的新 API 以前在应用程序之间共享数据和通信有点混乱 我相信这正是应用程序组旨在纠正的问题 在我的应用程序中 我启用了应用程序组并添加了一个新组 但我找不到任何有关如何使用它的文档 文档和 API
  • 获取本周的第一天和最后一天

    如何获取本周的第一天和最后一天 我需要的是某种方法来过滤一组具有 NSDate 属性的对象 只留下本周出现的对象 然后按天过滤它们 我还需要一些方法来获取本地化的日期名称 我尝试使用 NSCalendar NSDate 和 NSDateCo
  • 如何将数据从一个视图传递到下一个视图?

    我正在制作一个下载排队系统来下载视频 处理下载的排队代码位于另一个视图控制器中 现在我的问题是如何将下载的 URL 传递到另一个视图而不推送到另一个视图控制器 如下所示 ViewConntroller View ViewConntrolle
  • 如何将 CIFilter 输出到相机视图?

    我刚刚开始使用 Objective C 我正在尝试创建一个简单的应用程序 它显示带有模糊效果的相机视图 我得到了与 AVFoundation 框架一起使用的相机输出 现在 我正在尝试连接 Core 图像框架 但不知道如何连接 Apple 文
  • 如何检测 UISearchBar/UITextField 输入中的暂停?

    我有以下 UISearchbar 代码 void searchBar UISearchBar searchBar textDidChange NSString searchText UIApplication sharedApplicati

随机推荐

  • 子类化 datetime.timedelta 时出现奇怪的行为

    为了方便起见 我想创建 datetime timedelta 的子类 这个想法是这样定义一个类 class Hours datetime timedelta def init self hours super Hours self init
  • 如何将 SQLite 与 AngularJS 集成?

    我正在使用 google 地图 api v3 和一个名为 ng map 的插件制作一个 angularjs 应用程序 但我想将一些坐标存储在 SQLite 数据库中 然后从应用程序中检索 基本上 你不能 但是 如果您正在开发混合移动应用程序
  • MySQL 中的 CASE 性能?

    我想知道是否在 MySQL 查询中使用 CASE WHEN THEN 表达式对性能有负面影响吗 而不是使用 CASE 表达式 例如在 UPDATE 查询中 你总是有可能在你的程序中做出 if else 语句用 php python perl
  • ARM 汇编不能同时使用立即值和 ADDS/ADCS

    我目前正在尝试使用汇编来加速 Cortex M0 Freescale KL25Z 上的一些 C 函数 我遇到这个最小测试程序的问题 syntax unified cpu cortex m0 text global test code 16
  • 有没有办法在 Shiny 中构建时显示绘图,而不是等待所有绘图?

    我有一个闪亮的仪表板 里面有很多图 所有这些都需要几秒钟的时间来构建 一旦最后一个构建完成 它们就会全部显示 我希望每个图在完成后立即显示 我知道 R 是单线程的 但似乎必须有一种方法 将执行返回到显示代码 或类似的东西 这段代码演示了这个
  • tr1::function 可以吞掉返回值吗?

    boost 函数常见问题解答第 3 项 http www boost org doc libs 1 46 1 doc html function faq html具体解决了我感兴趣的场景 为什么有 void 的解决方法 回报 C 允许它们
  • 什么是 JavaScript 的服务器端渲染?

    一些 JavaScript 框架 例如 Dust js 声称它们还支持服务器端渲染 除了客户端渲染之外 有人可以解释这是如何工作的吗 我的理解是JS总是在浏览器运行时执行 JavaScript 可以使用以下系统在服务器上运行Node js
  • setInterval() 对性能有害吗? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Leaflet图层控制:选择图层组内的图层?

    我想要一个传单图层控件 我可以在其中选择一个基础图层 并使该基础图层本身成为一个图层组 我可以从中选择要显示的子图层 我正在考虑一种设置 在其中单击单选按钮来选择基础图层 图层组 然后在其下方我会看到一个复选框列表 用于显示其中的哪些图层
  • vb.net 复选框标签位置

    有没有办法将复选框放在 asp 复选框标签的右侧 默认情况下 此代码放置复选框 然后放置标签
  • java中静态变量的初始化

    静态变量在类加载时初始化 到底是什么意思 我在网上阅读了很多讨论 但仍然感到困惑 第 2 步是初始化步骤 对吗 那么第 1 步 加载类时 会发生什么 public class NewClass static int arr Step 1 N
  • 当未进行 4 字节对齐时,Monotouch 浮点指针会抛出 NullReferenceException

    我面临着一个我无法理解的问题 在使用 Monotouch 在 C 中使用不安全指针时 我在设备 ARM 上收到 NullReferenceException 但我无法解释原因 让我们看一些代码 var rand new Random var
  • 如何从 C++ 调用 Java 方法

    我正在使用 JNI 从 Java 调用我的 C 函数 C 函数的参数之一是jobject thiz 据我所知 所有 JNI 原生函数都有这个参数 该功能需要很长时间才能完成 我想向jobject thizJava 对象 以便我可以向用户显示
  • tensorflow.pad 是如何工作的?

    有tensorflow pad 的例子 t is 1 2 3 4 5 6 paddings is 1 1 2 2 rank of t is 2 tf pad t paddings CONSTANT gt 0 0 0 0 0 0 0 0 0
  • NPM 不安装任何模块:网络套接字挂起

    Salam 意思是你好 我在 ubuntu 12 04 上安装了最新版本的 node js 我没有使用任何代理 并且我的网络设置配置正确 并且自上次 NPM 正常工作以来一直保持完好 但现在 NPM 挂起任何模块的安装 并出现以下错误 na
  • 内部类放在哪里? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 将javascript变量传递给php而不刷新页面

    我有一个 5x5 网格的 div 框 其中 25 个 当我将一个项目放入其中时 我使用 jQuery UI 进行注册 它将收到它所放入的盒子的标题和项目的名称 该部分起作用 我想将标题和名称传递给 PHP 而不刷新页面 因为这样项目将重置
  • TF51005: 查询引用了不存在的字段。该错误是由“[Custom.ReflectedWorkItemId]”引起的

    我尝试将 Azure DevOps 板从一个组织迁移到另一个组织 我使用这个工具 https github com nkdAgility azure devops migration tools https github com nkdAg
  • 如何在 Bootstrap 中将单个下拉菜单附加到正文

    我看过下拉菜单的文档作为组件 http getbootstrap com components dropdowns and 分别使用javascript http getbootstrap com javascript dropdowns
  • PerformSelectorOnMainThread 实现的底层细节:

    想知道是否有人知道或有指向讨论 Cocoa 的 performSelectorOnMainThread 方法的低级实现细节的良好文档 我最好的猜测 我认为可能非常接近 是它使用 mach 端口或它们之上的抽象来提供线程内通信 将选择器信息作