Cómo forzar la carga de datos de NSController
Un problema recurrente a la hora de inicializar aplicaciones basadas en Core Data, es que las instancias de las subclases de NSController que se declaran en el nib (NSArrayController o NSTreeController, por ejemplo), no se alimentan de contenido de forma inmediata.
Supongamos un xib que contiene una instancia de NSArrayController, con el binding para el Managed Object Context correctamente asignado.
Imaginemos que al arrancar la aplicación, queremos obtener el número de elementos gestionados por ese array controller. Lo lógico sería hacer algo como esto (en el controlador de la aplicación, por ejemplo, y suponiendo la existencia de un outlet al arraycontroller):
{
int count = [ [ myController arrangedObjects ] count ];
}
Bien, pues eso va a devolver un cero como una casa de grande. ¿Por qué? Porque en el momento de completarse la carga del nib, no se ha completado la carga de las entidades gestionadas por el controlador.
Hay varias posibles soluciones. La primera, usar KVO, y observar el contenido del array controller, hasta recibir datos. La segunda, la recomendada en la documentación de Apple, forzar al controlador a cargar datos inmediatamente, haciendo un fetch con una request nula:
{
NSError *error;
BOOL ok = [ groupsController fetchWithRequest:nil merge:NO error:&error];
int count;
if( ok )
{
count = [ [ myController arrangedObjects ] count ];
}
}
Para que conste. Porque el tema es útil, sobre todo cuando se pretende cargar un controlador, con datos, en un xib que se carga dinámicamente.
Esto en PHP no pasa