Mejores prácticas para objects temporales en RestKit con datos básicos

Antecedentes: tengo un object gestionado, Car. Tengo una API de búsqueda REST llena en localhost / cars / search. Los resultados devueltos son objects de Car desde el lado del server, pero solo quiero save el que el usuario elija. El rest de los autos que quiero descartar cuando vuelven a salir de la búsqueda.

Al principio todo era como:

@interface Car : NSManagedObject //<--- managed object @property (nonatomic, strong) NSNumber* year; @property (nonatomic, strong) NSString* make; @property (nonatomic, strong) NSString* model; @end @interface TransientCar : NSObject //<--- regular NSObject! @property (nonatomic, strong) NSNumber* year; @property (nonatomic, strong) NSString* make; @property (nonatomic, strong) NSString* model; @end 

Estaba mapeando los resultados de búsqueda de la API REST JSON en objects TransientCar con el fin de mostrar resultados de búsqueda, pero no savelos en el context. De forma pnetworkingeterminada, si asigna un object gestionado, RestKit llamará a su fábrica de conveniencia de object + para crear el object e insertlo en el context actual (codificado de forma rígida en el context del almacén de objects de shanetworkingManager, por cierto).

Esto parecía insostenible. Así que ahora estoy usando NSMutableDictionary para contener los datos del resultado de la búsqueda hasta que el usuario accede a una vista de detalle y hace algo que valga la pena save un object gestionado real para:

 RKObjectMapping* tempCarMapping = [RKObjectMapping mappingForClass:[NSMutableDictionary class]]; [tempCarMapping mapKeyPathsToAttributes: @"year", @"year", @"make", @"make", @"model", @"model", nil]; 

¿Es esta una buena practica? ¿Utilizando NSMutableDictionary como una representación temporal hasta que el usuario haga algo que justifique insert un nuevo object en el context? Era una especie de fanático de usar la subclass de object gestionado original para representar los datos, pero de alguna manera poder marcarlo como "no save" o algo así, pero cada vez que lo hago siento que estoy luchando contra el marco (y condiciones de carrera). También traté de usar un context rasguño / desechable creando un nuevo RKObjectManager y simplemente borrando todo su context después, pero el método managedObjectContext de la categoría ActiveRecord de RestKit está codificado para devolver:

 [[[RKObjectManager shanetworkingManager] objectStore] managedObjectContext]; 

Eso desvirtúa la posibilidad de usar un context simple para datos de temp / basura.

Primero, he hecho esto en el pasado usando su método de tener dos copys del model, una que es para Core Data y otra que es transitoria (solo un NSObject). Eso funcionó sin problemas para mí.

En cuanto a tus otros bashs, no creo que la biblioteca te obligue tanto como piensas. Mire la API para RKManagedObjectStore y NSManagedObject+ActiveRecord . En particular, RKManagedObjectStore tiene una propiedad managedObjectContext , un método - (NSManagedObjectContext*)newManagedObjectContext y varios methods para combinar cambios.

Tienes razón en que [NSManagedObject managedObjectContext] siempre devuelve el context del gestor compartido, pero eso tiene sentido, es un método de class. De lo contrario, ¿cómo sabría la class qué context devolver? Pero es discutible ya que hay tantas otras forms de crear nuevos contexts y acceder a ellos. O eludir eso por completo, solo puede mantener una reference a su context temporal y usarlo directamente.

Esto le ofrece algunas opciones: tener varios ObjectManagers, tener un administrador de objects pero crear un context temporal y solo mantener los objects que desea, crear un object transitorio basado en el object administrado.

La opción NSMutableDictionary no parece tan flexible como los otros methods, pero no diría que sea "mala práctica".

Lamentablemente, todavía no tengo suficiente reputación de StackOverflow para poner esta respuesta donde pertenece (como comentarios a las otras respuestas), pero quería agregar algunos puntos.

Creo que la respuesta de Evan Cordell es errónea. La versión restkit actual (0.10.x) no le permite crear contexts para que RKManagedObjectLoaders los use, y RKObjectManagers puede tomar una tienda, pero debe ser de tipo RKManagedObjectStore, que está explícitamente vinculado a sqllite. La versión dev de restkit (0.20) aparentemente relaja eso, por lo que puede hacer que guarde los datos en una database en memory. Traté de anular los methods RKManagedObjectStore para usar un context que proporcioné, pero no funcionó … en cualquier caso, la solución parece no ser trivial.

El otro enlace dado, Mejor enfoque para crear objects temp para Core Data con Restkit , parece hacer con la publicación de un object y recibir el mismo object en la respuesta. Es un problema diferente al planteado en esta pregunta.

Hasta que se lance v.0.20.x, lo que esperamos sea pronto, parece que una jerarquía de class paralela es la única opción. ¡Si soy incorrecto, doy la bienvenida a la corrección en este punto!

También puede ver esta respuesta: Mejor enfoque para crear el object temporal para los datos principales con el kit de recuperación

Evitará el problema del object transitorio mencionado en la respuesta por Evan Cordell, que es un contribuidor principal de RestKit.