cocoa - Cocoa 中进程之间传递数据的最佳实践

标签 cocoa events event-handling ipc nsnotifications

我正在解决一个问题,需要我在 64 位 Cocoa 应用程序中执行以下操作:

  1. 从我的应用程序中生成 32 位 Cocoa 辅助工具(命令行工具)。此帮助程序将打开一个文件(准确地说是一个 Quicktime 电影)并使用仅限 32 位的 API(Quicktime-C API)访问有关该文件的信息
  2. 从 32 位进程收集的数据需要传回 64 位应用程序。
  3. 64 位应用应等到 32 位进程完成后再继续

在 Cocoa 中有很多方法可以实现这一点,但据我所知,我可以采取两种方法。

选项 1:带管道的 NSTask

  1. 使用 NSTask 生成 32 位进程
  2. 将 NSTasks stdoutput 重定向到管道,并在 64 位进程中从该管道读取数据。
  3. 解析来自管道的数据,这将涉及将字符串从标准输出转换为数据(整数、 float 、字符串等)

选项 2:带有 NSDistributedNotificationCenter 的 NSTask

  1. 使用 NSTask 生成 32 位进程
  2. 当 32 位进程中的数据准备就绪时,向分布式通知中心发送 NSNotification,并在事件中包含包含所有相关数据的字典。
  3. 在 64 位应用中订阅相同的 NSNotification

所以我对 StackOverflowers 的问题是,哪个选项“更好”?
哪种做法更好?
哪个更有效率?

我倾向于选项 2,因为看起来涉及的代码会更少。如果这两种方法都不好,是否有更好的方法?

最佳答案

你说子进程将是一个应用程序。不要为此使用 NSTask — 它会混淆 Launch Services。 (如果您的意思是它是一个辅助工具,以便好奇的专家用户可以从命令行运行它,那么 NSTask 就可以了。)

DNC 可以以任何一种方式工作,但如果子进程确实是一个应用程序,请不要使用 NSTask+NSPipe - 使用分布式对象。

关于cocoa - Cocoa 中进程之间传递数据的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/504122/

相关文章:

ruby - 使用macruby和Objective-C时的内存管理

c# - 没有监听器的事件会对性能产生相当大的影响吗?

java - 为什么在匿名类中只能访问最终变量?

python - wxPython:向多个小部件发送信号

swift - NSURLSession 和 Twitter 流 API

ios - 从单个单位数组构建 NSCalendarUnit 值

objective-c - 区分 Mac OS X 钥匙串(keychain)中的 session 和系统项目

javascript - Jquery dispatchEvent 包装器方法

html - 为什么 Chrome 的 img 元素的 onerror 事件只触发一次?

android - Jetpack Compose 卡上的事件处理