2011-11-29 24 views
56

¿Es realmente tan simple ahora en iOS5?Recuperación de fondo de datos básicos a través de NSPrivateQueueConcurrencyType

que utiliza para llevar a cabo un fondo traiga utilizando este código en mi AppDelegate:

dispatch_queue_t downloadQueue = dispatch_queue_create("DownloadQueue", NULL); 
dispatch_async(downloadQueue, ^{ 
     self.myDownloadClass = [[MyDownloadClass alloc]initInManagedObjectContext:self.managedObjectContext]; 
     [self.myDownloadClass download]; 
    }); 

dispatch_release(downloadQueue); 

Mi clase de descarga realiza una NSURLConnection se pudieron obtener algunos datos XML, utiliza NSXMLParser para analizar los datos, y luego actualiza un esquema complejo en datos básicos Siempre cambiaba al hilo principal para actualizar realmente los datos centrales. código desordenado, con una gran cantidad de llamadas a dispatch_sync (dispatch_get_main_queue() ....

Mi nuevo código es el siguiente:

NSManagedObjectContext *child = [[NSManagedObjectContext alloc]initWithConcurrencyType:NSPrivateQueueConcurrencyType]; 
[child setParentContext:self.managedObjectContext]; 

[child performBlock:^{ 
    self.myDownloadClass = [[MyDownloadClass alloc]initInManagedObjectContext:child]; 
    [self.myDownloadClass download]; 
    }]; 

junto con un pequeño cambio en algún otro código en mi AppDelegate para establecer el padre modelo de objetos de tipo de contexto a NSMainQueueConcurrencyType:

- (NSManagedObjectContext *)managedObjectContext 
{ 
    if (__managedObjectContext != nil) 
    { 
     return __managedObjectContext; 
    } 

    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; 
    if (coordinator != nil) 
    { 
     __managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType]; 
     [__managedObjectContext setPersistentStoreCoordinator:coordinator]; 
    } 
    return __managedObjectContext; 
} 

parece que funciona muy bien todo el proceso de actualización aún se ejecuta en un hilo separado, pero yo no tenga que crear un hilo parece que la magia

...

Solo recuerde que si desea enviar sus cambios a los archivos físicos de datos centrales, tiene que guardar la llamada: en el contexto principal también.

Realmente no hice una pregunta aquí. Estoy publicando esto, así que ayuda a los demás porque todo lo que encontré cuando buscaba los nuevos métodos de contexto de objetos administrados iOS5 solo proporcionaba detalles de alto nivel sin ejemplos de código Y todas las otras búsquedas para buscar datos básicos en el fondo son antiguas, a veces muy antiguas y analiza cómo hacerlo antes de iOS5.

+0

¿es realmente así de fácil? – timthetoolman

+0

¡gracias por compartir! – Max

+0

y después de eso debe guardar los cambios –

Respuesta

0

Estoy tratando de entender cómo se implementa esta nueva API. Mi patrón habitual para los datos básicos de multiproceso es algo como esto:

Por lo general, en un NSOperation pero simplificada usando dispatch_async en este ejemplo:

dispatch_queue_t coredata_queue; // some static queue 

dispatch_async(coredata_queue, ^() { 
    // get a new context for this thread, based on common persistent coordinator 
    NSManagedObjectContext *context = [[MyModelSingleton model] threadedContext]; 

    // do something expensive 

    NSError *error = nil; 
    BOOL success = [context save:&error]; 
    if (!success) { 
     // the usual. 
    } 

    // callback on mainthread using dispatch_get_main_queue(); 
}); 

A continuación, el hilo principal responderá mediante la actualización de la interfaz de usuario basada en NSManagedObjectContextDidSaveNotification fusionar el contexto principal.

Las nuevas API parecen ser un envoltorio alrededor de este patrón, donde el contexto child parece que solo necesita que el coordinador persistente de su elemento primario cree un nuevo contexto. Y al especificar NSPrivateQueueConcurrencyType en init, se asegurará de que el parámetro performBlock se ejecute en la cola privada.

La nueva API no parece ser mucho menos código para escribir. ¿Alguna ventaja sobre el enhebrado 'tradicional'?

2

Sí - es realmente así de fácil ahora (en iOS 5.0). Para compatibilidad con iOS 4, los obstáculos previos permanecen, pero la documentación no es demasiado mala para el confinamiento del hilo. ¿Tal vez deberías agregar esto a una sección wiki?

Cuestiones relacionadas