Лучшие практики для передачи данных между процессами в Какао - PullRequest
4 голосов
/ 02 февраля 2009

Я нахожусь в процессе решения проблемы, которая требует от меня сделать следующее в моем 64-битном приложении Какао:

  1. Создает 32-битный вспомогательный инструмент Какао (инструмент командной строки) из моего приложения. Этот помощник откроет файл (точнее, фильм быстрого времени) и получит доступ к информации об этом файле, используя только 32-битные API (API Quicktime-C)
  2. Данные, собранные в 32-битном процессе, должны быть переданы обратно в 64-битное приложение.
  3. 64-битное приложение должно дождаться завершения 32-битного процесса, прежде чем продолжить

Есть много способов сделать это в Какао, но из того, что я понял, это два подхода, которые я мог бы использовать.

Вариант 1: NSTask с трубами

  1. Использование NSTask для запуска 32-битного процесса
  2. Перенаправить стандартный вывод NSTasks в канал и считывать данные из этого канала в 64-битном процессе.
  3. Разбор данных из канала, который будет включать преобразование строк из стандартного вывода в данные (целые числа, числа с плавающей запятой, строки и т. Д.)

Вариант 2: NSTask с NSDistributedNotificationCenter

  1. Использование NSTask для запуска 32-битного процесса
  2. Когда данные будут готовы в 32-разрядном процессе, отправьте NSNotification в распределенный центр уведомлений и включите в событие словарь со всеми соответствующими данными.
  3. В 64-битном приложении подписаться на тот же NSNotification

Итак, мой вопрос к StackOverflowers: какой вариант «лучше»?
Какая практика лучше?
Что является более эффективным?

Я склоняюсь к варианту 2, потому что, похоже, будет задействовано меньше кода. Если эти два подхода не велики, есть ли лучший способ сделать это?

Ответы [ 2 ]

3 голосов
/ 02 февраля 2009

Вы говорите, что подпроцесс будет приложением. Не используйте для этого NSTask - это сбивает с толку Launch Services. (Если вы имеете в виду, что это вспомогательный инструмент, так что любопытный опытный пользователь может запустить его из командной строки, тогда NSTask в порядке.)

DNC будет работать в любом случае, но если подпроцесс действительно является приложением, не используйте NSTask + NSPipe - используйте распределенные объекты.

2 голосов
/ 05 февраля 2009

NSDistributedNotificationCenter будет работать нормально, но имейте в виду, что ваше приложение не «гарантирует» получение распределенных уведомлений операционной системой. На самом деле я не видел этого на практике, но об этом нужно помнить при выборе технологии.

Другой вариант, который вы не упомянули - это распределенные объекты. Распределенные объекты сделаны именно для этой цели. Он обрабатывает или сериализацию или настройку прокси-объектов, которые работают между процессами или по сети. Документации немного не хватает, она не поддерживает некоторые новые части Какао, такие как привязки, ее не совсем просто использовать, но я все же предпочитаю ее, когда работаю над двумя процессами, которые работают вместе сложным образом.

...