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