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

时间:2009-02-02 17:47:12

标签: cocoa events event-handling ipc nsnotifications

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

  1. 从我的应用程序中生成一个32位Cocoa帮助工具(命令行工具)。这个帮助器将打开一个文件(准确地说是一个快速电影)并使用仅32位API(Quicktime-C API)访问有关该文件的信息
  2. 从32位进程收集的数据需要传递回64位应用程序。
  3. 64位应用应该等到32位进程完成后再继续
  4. 在Cocoa中有很多方法可以实现这一点,但从我收集的内容来看,这是我可以采取的两种方法。

    选项1:NSTask with Pipes

    1. 使用NSTask生成32位进程
    2. 将NSTasks stdoutput重定向到管道,并在64位进程中从该管道读取数据。
    3. 解析管道中的数据,这将涉及将字符串从stdout转换为数据(整数,浮点数,字符串等)。
    4. 选项2:NSTask with NSDistributedNotificationCenter

      1. 使用NSTask生成32位进程
      2. 当数据在32位进程中就绪时,将NSNotification发送到分布式通知中心,并在事件中包含所有相关数据的字典。
      3. 在64位应用程序中订阅相同的NSNotification
      4. 所以我对StackOverflowers的问题是,哪个选项“更好”?
        哪种更好的做法?
        哪个更有效率?

        我倾向于选项2,因为似乎涉及的代码较少。如果这两种方法都不是很好,那么有更好的方法吗?

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

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

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