Pregunta

Estoy trabajando con CoreData en Cocoa (no basado en documentos). Mi problema es que quiero acceder a SAME NSArrayController desde diferentes NIB. Pero cada NIB tiene una instancia propia de este NSArrayController.

Mi pregunta ahora es cómo podría generar objetos compartidos (como NSUserDefaultsController). Me ayudaría mucho. Gracias por tus respuestas. =)

¿Fue útil?

Solución

Generalmente no desea compartir un NSArrayController entre las puntas. Probablemente sea mejor tener múltiples NSArrayController (uno por NIB) que están vinculados al mismo modelo subyacente. Si desea que este modelo (por ejemplo, un NSArray) sea una aplicación global, puede exponerlo a través del delegado de NSApplication (por ejemplo, crear una instancia de su clase MyAppDelegate personalizada en MainMenu.nib y conectar la salida delegate de NSApplication a la instancia de su clase MyAppDelegate) . En otras NIB, puede vincular el enlace contentArray de NSArrayController a Shared Application.delegate.myArray (suponiendo que MyAppDelegate exponga & # 8212; a través de métodos compatibles con KVC & # 8212; un enlace NSArray llamado myArray). Básicamente, está utilizando IB y MainMenu.nib para crear su instancia singleton de MyAppDelegate.

Tenga en cuenta que este enfoque dificulta las pruebas unitarias de su aplicación, ya que ahora hay puntos únicos en el gráfico de objetos que no puede burlarse o rechazar durante las pruebas. Sería mucho mejor crear un NSWindowController o NSViewController para cada NIB secundaria (no MainMenu.nib) y vincular los NSArrayControllers en esas puntas a File Owner.myArray. Luego puede crear una instancia de NSWindowController o NSViewController, pasándole una matriz (u objeto compatible con KVC de matriz) antes de cargar la NIB secundaria. De esta manera, puede probar la funcionalidad de las puntas de forma aislada (utilizando un simulacro o trozo para la matriz).

Otros consejos

No estoy realmente seguro de tratar de reutilizar NSArrayController es la mejor opción (necesitaría saber más sobre su proyecto, pero nunca me he encontrado con una situación en la que haría algo así), pero usted puede usar una variable estática dentro de un método de clase así:

+ (id)sharedObject;
{
    static id object = nil;

    if ( object == nil )
    {
        object = [[self alloc] init];
    }

    return object;
}

Tenga en cuenta que este no es un verdadero singleton, ya que aún puede asignar objetos adicionales de esa clase. Puede usar esta guía si realmente desea sé estricto.

Matt Gallagher tiene una buena publicación en singletons y otras formas tener " global " datos sobre su blog que tal vez quieras visitar también. Es un poco más claro que la documentación de Apple, y tiene un enlace a un archivo de encabezado que hace que sea agradable y fácil crear singletons de casi cualquier clase de Cocoa.

En realidad estoy usando su archivo de encabezado en algunos de mis proyectos, y funciona muy bien.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top