Cómo save objects personalizados en matriz y almacenarlos en NSUserDefaults – iPhone

Obtengo mi object de class personalizado después del método de acción del button. Ahora necesito almacenar varios objects personalizados en NSMutableArray y luego almacenar esta matriz en NSUserDefaults .

Aquí está mi código:

 -(IBAction)onClickSubmitLater:(id)sender { //Saving store in user defaults for later upload data. NSMutableArray *arrayStoreList = [[NSMutableArray alloc] init]; arrayStoreList = [Util getArrayPreference:@"Store"];//arrayStoreList is the list of all stores. Store *store = [[Store alloc] init]; store = [arrayStoreList objectAtIndex:self.selectedStoreIndex];//here i am getting particular store that i need to save in array. //archive NSData *dataStore = [NSKeyedArchiver archivedDataWithRootObject:store]; [[NSUserDefaults standardUserDefaults] setObject:dataStore forKey:@"resultStore"]; //unarchive NSData *dataResultStore = [[NSUserDefaults standardUserDefaults] objectForKey:@"resultStore"]; Store *resultStore = (Store *)[NSKeyedUnarchiver unarchiveObjectWithData:dataResultStore]; NSLog(@"%@", resultStore); } 

Usando el código anterior, está guardando el object Store class personalizada en NSUserDefaults . Entonces me gustaría save todo el object Store en NSMutableArray después de enviar más tarde ibaction. Más tarde, searché un set de tiendas para cargar una tienda en el server una por una.

Gracias.

Para almacenar y recuperar una matriz con un object personalizado en los valores pnetworkingeterminados del usuario, puede usar los siguientes methods:

 -(void)writeArrayWithCustomObjToUserDefaults:(NSString *)keyName withArray:(NSMutableArray *)myArray { NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; NSData *data = [NSKeyedArchiver archivedDataWithRootObject:myArray]; [defaults setObject:data forKey:keyName]; [defaults synchronize]; } -(NSArray *)readArrayWithCustomObjFromUserDefaults:(NSString*)keyName { NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; NSData *data = [defaults objectForKey:keyName]; NSArray *myArray = [NSKeyedUnarchiver unarchiveObjectWithData:data]; [defaults synchronize]; return myArray; } 

Pero asegúrate de haber implementado

 - (void) encodeWithCoder : (NSCoder *)encode ; - (id) initWithCoder : (NSCoder *)decode; 

Método en la class de model de datos para evitar el locking como sigue:

 - (void)encodeWithCoder:(NSCoder *)coder; { [coder encodeObject:label forKey:@"label"]; [coder encodeInteger:numberID forKey:@"numberID"]; } - (id)initWithCoder:(NSCoder *)coder; { self = [super init]; if (self != nil) { label = [[coder decodeObjectForKey:@"label"] retain]; numberID = [[coder decodeIntegerForKey:@"numberID"] retain]; } return self; } 

NSCoding archivarla implementando el protocolo NSCoding . Entonces puedes escribirlo en cualquier file.

Implementa estos methods en tu model:

 - (void) encodeWithCoder : (NSCoder *)encode ; - (id) initWithCoder : (NSCoder *)decode; 

Como dices, has implementado esto en la class, ahora debes save la matriz.

Para save y leer la matriz, debe usar:;

 [[NSUserDefaults standardUserDefaults] setObject:yourMutableArray forKey:@"keyForArray"]; NSMutableArray *array = [NSMutableArray arrayWithArray:[[NSUserDefaults standardUserDefaults] objectForKey:@"keyForArray"]]; 

Estos dos methods se utilizarán principalmente para store y retrieve la propiedad del object personalizado.

 - (void)encodeWithCoder:(NSCoder *)encoder ; - (id)initWithCoder:(NSCoder *)decoder; 

Mire la respuesta de @ chrissr, la respuesta de @ Brad Larson