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
Post a Comment