2009-11-07 15 views
6

¿Qué estoy tratando de hacer?¿Hay alguna forma de compartir un almacén de datos centrales entre procesos?

  1. Un proceso de interfaz de usuario que lee datos de un almacén de datos básicos en el disco. No necesitaría editar los datos, solo leer y visualizar los datos.

  2. Proceso de línea de comandos que se escribe en el mismo almacén de datos al que accede la IU.

¿Por qué?

Para que el proceso de línea de comandos se pueda ejecutar todo el tiempo pero el usuario puede salir del proceso de IU y olvidarse de la aplicación hasta que tenga que mirar los datos que ha capturado.

¿Cuál sería la forma más simple y confiable de lograr esto?

¿Qué he intentado?

He leído sobre cómo compartir una tienda de datos entre subprocesos e implementado esto una vez antes, pero no puedo encontrar nada en los documentos o en la web que indique cómo compartir una tienda entre procesos.

¿Es tan simple como señalar ambos procesos en el mismo archivo del almacén de datos? He experimentado con esto brevemente. Parece que funciona bien, pero me preocupa que pueda tener problemas con el bloqueo, etc., cuando está realmente bajo estrés.

Finalmente

me lo agradecería que alguien me da indicaciones sobre qué dirección ir con esto. Gracias.

Respuesta

2

Esta podría ser una de esas situaciones en las que simplemente tendrá que probarlo y verlo ™.

En la medida en que puedo recordar, SQLite (que es el almacén de datos que probablemente querrá utilizar) tiene mecanismos incorporados para el bloqueo de archivos y demás; por lo que es probable que la integridad del archivo esté asegurada. Si, por otro lado, usa el enfoque CoreData/XML, puede tener problemas.

En otras palabras; use el respaldo SQLite para su archivo, y probablemente esté bien.

1

Necesita volver a pensar su arquitectura. Si desea que un daemon sea el propietario del almacén de datos, haga que su aplicación GUI se conecte con el daemon. Intentar compartir el almacén de datos es una lata de gusanos que no desea abrir.

+0

Eso no es necesariamente cierto. Un almacén de datos del núcleo persistente basado en SQLite funcionará bien siempre que no haya miles de operaciones de escritura/segundo desde el daemon. – bbum

+0

Y como literalmente tengo 12 salvaciones cada 3 segundos, ¡creo que califica como menos de "un bazillion"! :) –

2

Puede hacer exactamente lo que quiera, probablemente quiera usar la tienda SQLite, de lo contrario, guardar y confirmar cada vez que quiera sincronizar los datos será terriblemente lento. Solo necesita usar un tipo de timbre de IPC entre las aplicaciones para que pueda informar una aplicación que necesita para volver a verificar la tienda persistente en el disco y fusionar sus datos.

Documentos de Apple que usan múltiples corindadores de tienda persistentes como una opción válida en Multi-Threading with Core Data (en "Pautas generales", abre 2). Esto sucede cuando se discuten pilas de CD completamente paralelas en el mismo proceso, pero es válido si también están en espacios de direcciones completamente separados.

+0

Gracias. Eso es realmente útil. Supongo que pasar datos entre los procesos que utilizaría NSDistributedNotificationCenter u objetos distribuidos. Me estoy inclinando hacia este último. http://stackoverflow.com/questions/504122/best-practices-for-passing-data-between-processes-in-cocoa –

+0

Claro, pero si todo está pasando por la tienda persistente que acaba de guardar: en un proceso , envíe una notificación y en la otra aplicación actualice la pila de persistencia. Consulte http://developer.apple.com/mac/library/documentation/cocoa/Conceptual/CoreData/Articles/cdUsingMOs.html#//apple_ref/doc/uid/TP40001803-208900 –

+0

Puede usar las notificaciones distribuidas, un kqueue , o un dispatch_source para supervisar el archivo de la tienda sqlite para modificaciones. Simplemente no encuestas. – bbum

2

Casi dos años después, y acabo de encontrar una forma mucho mejor de hacerlo.

La respuesta parece estar en los Servicios de sincronización. ¡Ni siquiera me di cuenta de que existía! Hay un excelente post sobre esto en:

http://www.timisted.net/blog/archive/core-data-and-sync-services/

no he intentado esto con mi aplicación aún, pero parece como una excelente manera de compartir un almacén de datos central entre dos procesos o aplicaciones.

Si experimento algún problema de rendimiento, actualizaré esta respuesta en consecuencia, pero esta parece ser la manera recomendada por Apple para hacerlo.

+0

SyncServices parece haber sido abandonado a favor de iCloud. – stevesliva

+0

Esta respuesta debe actualizarse ahora que los Servicios de sincronización están prácticamente desaprobados a partir de Yosemite. Además, la introducción de las extensiones de aplicaciones hace que esta pregunta sea aún más importante (es decir, compartir un almacén de datos centrales entre la aplicación principal y la extensión). – adib

Cuestiones relacionadas