Mejores prácticas para pasar datos entre procesos en Cocoa
events event-handling (2)
Estoy en el medio de resolver un problema que me obliga a hacer lo siguiente en mi aplicación Cocoa de 64 bits:
- Genere una herramienta de ayuda de Cocoa de 32 bits (herramienta de línea de comandos) desde mi aplicación. Este ayudante abrirá un archivo (una película de tiempo rápido para ser preciso) y accederá a información sobre ese archivo usando API de solo 32 bits (Quicktime-C API)
- Los datos recopilados del proceso de 32 bits deben pasarse a la aplicación de 64 bits.
- La aplicación de 64 bits debe esperar hasta que el proceso de 32 bits finalice antes de continuar
Hay muchas maneras de lograr esto en Cocoa, pero por lo que veo, estos son dos enfoques que podría tomar.
Opción 1: NSTask con tubos
- Use NSTask para generar el proceso de 32 bits
- Redirija la salida std de NSTasks a una tubería, y lea datos de esa tubería en el proceso de 64 bits.
- Analice los datos de la tubería, lo que implicará convertir cadenas de stdout en datos (ints, flotantes, cadenas, etc.)
Opción 2: NSTask con NSDistributedNotificationCenter
- Use NSTask para generar el proceso de 32 bits
- Cuando los datos estén listos en el proceso de 32 bits, envíe una NSNotification al centro de notificaciones Distribuido, e incluya un diccionario en el evento con todos los datos pertinentes.
- En la aplicación de 64 bits suscríbase a la misma NSNotification
Entonces mi pregunta para StackOverflowers es, ¿qué opción es "mejor"?
¿Cuál es una mejor práctica?
¿Cuál es más eficiente?
Me inclino por la Opción 2 porque parece que habrá menos código involucrado. Si estos dos enfoques no son excelentes, ¿hay una mejor manera de hacerlo?
Usted dice que el subproceso será una aplicación. No use NSTask para eso; confunde Servicios de lanzamiento. (Si te refieres a que es una herramienta de ayuda, tal que un curioso usuario experto podría ejecutarla desde la línea de comando, entonces NSTask está bien).
El DNC funcionará de cualquier manera, pero si el subproceso es realmente una aplicación, no use NSTask + NSPipe-use objects distribuidos.
NSDistributedNotificationCenter funcionará bien, pero tenga en cuenta que su aplicación no está "garantizada" para recibir notificaciones distribuidas por el sistema operativo. No he visto esto en la práctica, pero es algo a tener en cuenta cuando eliges una tecnología.
La otra opción que no mencionó es objetos distribuidos. Los objetos distribuidos están hechos exactamente para este propósito. Maneja la serialización o la configuración de objetos proxy que funcionan entre procesos o en una red. La documentación es un poco escasa, no admite algunas partes más nuevas de las vinculaciones de Cocoa, no es exactamente fácil de usar, pero todavía lo prefiero cuando estoy trabajando en dos procesos que funcionan juntos de una manera compleja.