Antecedentes: Tengo un objeto administrado, Car. Tengo una API de búsqueda RESTful sentada en localhost/cars/search. Los resultados devueltos son objetos Car del lado del servidor, pero solo quiero guardar el que el usuario elija. El resto de los autos que quiero descartar cuando vuelven a salir de la búsqueda.Práctica recomendada para objetos temporales en RestKit con Core Data
Al principio era todo 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
me mapeo de la búsqueda API REST resultados JSON en objetos TransientCar a efectos de mostrar los resultados de búsqueda, pero no guardarlos en el contexto. De forma predeterminada, si mapea un objeto administrado, RestKit llamará a su objeto fábrica + objeto para crear el objeto e insertarlo en el contexto actual (codificado en el contexto de la tienda de objetos de sharedManager, por cierto!)
Esto parecía insostenible. Así que ahora sólo estoy usando NSMutableDictionary para contener los datos de resultados de búsqueda hasta que el usuario pulsa en una vista en detalle y hace algo vale la pena ahorrar un objeto real administrado por:
RKObjectMapping* tempCarMapping = [RKObjectMapping mappingForClass:[NSMutableDictionary class]];
[tempCarMapping mapKeyPathsToAttributes:
@"year", @"year",
@"make", @"make",
@"model", @"model",
nil];
Es esta una buena práctica? ¿Usar NSMutableDictionary como representación temporal hasta que el usuario haga algo que justifique insertar un nuevo objeto en el contexto? Me encantaba usar la subclase original de objetos gestionados para representar los datos, pero de alguna manera podía marcarla como "no mantener" o algo así, pero cada vez que hago eso siento que estoy luchando contra el marco (y condiciones de carrera). También he intentado usar un contexto de cero/desechable mediante la creación de un nuevo RKObjectManager y simplemente despejar toda su contexto más tarde, pero el método + managedObjectContext, bajo la categoría ActiveRecord de RestKit está codificado para volver:
[[[RKObjectManager sharedManager] objectStore] managedObjectContext];
Ese tipo de portillos la posibilidad de utilizar siempre un contexto de raspado para datos de temperatura/basura.
Tener una clase de modelo transitoria que simplemente hereda de NSObject está bien, pero mi mayor preocupación es mantener el modelo transitorio actualizado con la versión de NSManagedObject. Es más un problema de mantenimiento del código que uno técnico. Sería bueno que la subclase Editor> Generar NSManagedObject tuviera una casilla de verificación "con la subclase NSObject duplicada". –
Ciertamente, y si su modelo cambiará con cualquier frecuencia, uno de los otros métodos que describí sería una buena opción. –