4

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

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

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

选项 1:带有管道的 NSTask

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

选项 2:带有 NSDistributedNotificationCenter 的 NSTask

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

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

我倾向于选项 2,因为似乎涉及的代码更少。如果这两种方法都不是很好,有没有更好的方法来做到这一点?

4

2 回答 2

3

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

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

于 2009-02-02T18:05:25.240 回答
2

NSDistributedNotificationCenter 可以正常工作,但请记住,您的应用程序并不能“保证”接收操作系统的分布式通知。我实际上并没有在实践中看到这一点,但在选择技术时要记住这一点。

您没有提到的另一个选项是分布式对象。分布式对象正是为此目的而制作的。它处理序列化或设置在进程之间或通过网络工作的代理对象。文档有点缺乏,它不支持 Cocoa 的一些较新的部分,例如绑定,它不是很容易使用,但是当我处理两个以复杂方式协同工作的进程时,我仍然更喜欢它。

于 2009-02-05T18:00:21.753 回答