objective c - iOS - An NSArray of a single NSData object saved in NSUserDefault come out to be NSData? -


i'm saving customized class deviceinfo in nsdefault.

i used nskeyedarchiver archive object nsdata object.

as want save array of deviceinfo objects nsuserdefault, put archived objects nsarray.

however, seems that, when there's 1 nsdata object in array, nsdata object while should nsarray object when fetch nsuserdefault.

why that?

here's code.

nsdata* data = [nskeyedarchiver archiveddatawithrootobject:_deviceinfo];  nsmutablearray *temp = [nsmutablearray new]; temp = [[sdgriditemcachetool itemsarray] mutablecopy];    //[[sdgriditemcachetool itemsarray]] method fetch array, paste code below. [temp addobject:data]; [sdgriditemcachetool saveitemsarray:[temp copy]]; 

and code save , fetch data nsuserdefault

//sdgriditemcachetool.m + (nsarray *)itemsarray {     return [[nsuserdefaults standarduserdefaults] objectforkey:kitemsarraycachekey]; }  + (void)saveitemsarray:(nsarray *)array {     [[nsuserdefaults standarduserdefaults] setobject:[array copy] forkey:kitemsarraycachekey];     [[nsuserdefaults standarduserdefaults] synchronize]; } 

finally deviceinfo class:

@interface deviceinfo : nsobject <nscoding>  @property (nonatomic, retain) nsstring* title; @property (nonatomic, retain) nsstring* imageresstring; @property (nonatomic, retain) nsnumber* currentstat; @property (nonatomic, retain) nsdictionary* colorstatpair;  @end  @implementation deviceinfo  - (instancetype)initwithcoder:(nscoder *)adecoder {     if (self = [super init]) {         _title = [adecoder decodeobjectforkey:kuserdefaultdevicetitlekey];         _imageresstring = [adecoder decodeobjectforkey:kuserdefaultdeviceimageresstringkey];         _currentstat = [adecoder decodeobjectforkey:kuserdefaultdevicecurrentstatkey];         _colorstatpair = [adecoder decodeobjectforkey:kuserdefaultdevicecolorstatpair];     }     return self; }  -(void)encodewithcoder:(nscoder *)acoder {     [acoder encodeobject:_title forkey:kuserdefaultdevicetitlekey];     [acoder encodeobject:_imageresstring forkey:kuserdefaultdeviceimageresstringkey];     [acoder encodeobject:_currentstat forkey:kuserdefaultdevicecurrentstatkey];     [acoder encodeobject:_colorstatpair forkey:kuserdefaultdevicecolorstatpair]; }  @end 

there few issues code.

your itemsarray method return nil until save data. need handle properly. saveitemsarray: method needlessly copy of array , needlessly calls synchronize.

updated sdgriditemcachetool.m

+ (nsarray *)itemsarray {     nsarray *result = [[nsuserdefaults standarduserdefaults] objectforkey:kitemsarraycachekey];     if (!result) {         result = [nsarray array];     }      return result; }  + (void)saveitemsarray:(nsarray *)array {     [[nsuserdefaults standarduserdefaults] setobject:array forkey:kitemsarraycachekey]; } 

and code calls these 2 methods needs cleanup.

nsdata* data = [nskeyedarchiver archiveddatawithrootobject:_deviceinfo];  nsmutablearray *temp = [[sdgriditemcachetool itemsarray] mutablecopy]; [temp addobject:data]; [sdgriditemcachetool saveitemsarray:temp]; 

there no need create nsmutablearray , replace it. , there's no need copy array.

you may wish delete , reinstall app start clean user defaults. if have changed code bit, may have non-array stored in key earlier code.


Comments

Popular posts from this blog

php - How to display all orders for a single product showing the most recent first? Woocommerce -

asp.net - How to correctly use QUERY_STRING in ISAPI rewrite? -

angularjs - How restrict admin panel using in backend laravel and admin panel on angular? -