Background: Ho un oggetto gestito, Car. Ho una API di ricerca RESTful seduta su localhost/auto/ricerca. I risultati restituiti sono oggetti Car dal lato server, ma voglio solo salvare quello scelto dall'utente. Il resto delle macchine che voglio scartare quando toccheranno fuori dalla ricerca.Best practice per oggetti temporanei in RestKit con Core Data
All'inizio ero tutti come:
@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
stavo mappatura della ricerca API REST risultati JSON in oggetti TransientCar ai fini della visualizzazione dei risultati di ricerca, ma non li risparmio al contesto. Per impostazione predefinita, se si esegue il mapping di un oggetto gestito, RestKit chiamerà il suo + oggetto factory di convenienza per creare l'oggetto e inserirlo nel contesto corrente (hardcoded per il contesto del negozio oggetti condiviso, btw!)
Questo sembrava insostenibile. Così ora sto usando solo NSMutableDictionary per contenere i dati dei risultati di ricerca fino a quando l'utente tocca in una vista di dettaglio e fa qualcosa vale la pena salvare un oggetto reale gestito per:
RKObjectMapping* tempCarMapping = [RKObjectMapping mappingForClass:[NSMutableDictionary class]];
[tempCarMapping mapKeyPathsToAttributes:
@"year", @"year",
@"make", @"make",
@"model", @"model",
nil];
Si tratta di una buona pratica? Usando NSMutableDictionary come rappresentazione temporanea fino a quando l'utente non fa qualcosa che garantisce l'inserimento di un nuovo oggetto nel contesto? Ero un po 'un fan dell'uso della sottoclasse dell'oggetto gestito originale per rappresentare i dati, ma in qualche modo di poterlo contrassegnare come "non tenere" o qualcosa del genere, ma ogni volta che lo faccio mi sento come se stessi combattendo il framework (e condizioni di gara). Ho anche provato ad utilizzare un graffio/contesto usa e getta con la creazione di un nuovo RKObjectManager e proprio di compensazione tutto il suo contesto in seguito, ma il metodo + managedObjectContext di di RestKit categoria ActiveRecord è hardcoded per tornare:
[[[RKObjectManager sharedManager] objectStore] managedObjectContext];
Quella sorta di scappa la possibilità di mai usare un contesto zero per i dati temp/trash.
Avere una classe di modello transitoria che eredita solo da NSObject va bene, ma la mia più grande preoccupazione è mantenere il modello transitorio aggiornato con la versione NSManagedObject. È più un problema di manutenibilità del codice che tecnico. Sarebbe bello che la sottoclasse Editor> Genera NSManagedObject avesse una casella di controllo per "con sottoclasse NSObject con mirroring". –
Certamente - e se il tuo modello cambierà con qualsiasi frequenza, uno degli altri metodi che ho delineato sarebbe una buona scelta. –