사용자 정의 클래스 DeviceInfo
을 NSDefault에 저장합니다.iOS - NSUserDefault에 저장된 단일 NSData 객체의 NSArray가 NSData가됩니다.
이미 NSKeyedArchiver
을 사용하여 개체를 NSData
개체로 보관합니다.
deviceInfo
개체의 배열을 NSUserDefault
에 저장하려면 보관 된 개체를 NSArray
에 넣으십시오.
그러나, 배열에 하나의 NSData
객체가있을 때 나는 NSUserDefault
에서 가져올 때이 NSArray
오브젝트해야하지만, 나는 항상 NSData
개체를 얻을 것으로 보인다.
왜 그럴까요?
다음은 코드입니다.
NSData* data = [NSKeyedArchiver archivedDataWithRootObject:_deviceInfo];
NSMutableArray *temp = [NSMutableArray new];
temp = [[SDGridItemCacheTool itemsArray] mutableCopy]; //[[SDGridItemCacheTool itemsArray]] is the method the fetch the array, I paste the code below.
[temp addObject:data];
[SDGridItemCacheTool saveItemsArray:[temp copy]];
그리고 코드를 저장하고 NSUserDefault
//SDGridItemCacheTool.m
+ (NSArray *)itemsArray
{
return [[NSUserDefaults standardUserDefaults] objectForKey:kItemsArrayCacheKey];
}
+ (void)saveItemsArray:(NSArray *)array
{
[[NSUserDefaults standardUserDefaults] setObject:[array copy] forKey:kItemsArrayCacheKey];
[[NSUserDefaults standardUserDefaults] synchronize];
}
마지막으로 DeviceInfo
클래스에서 데이터를 가져올 수 :
@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
처음 두 줄의 코드에서 두 개의 불필요한 배열 객체를 만들었습니다. 그리고 arrayByAddingObject가 있습니다. 또 하나는 saveItemsArray에 있습니다. 동기화를 호출 할 필요가 없습니다. – gnasher729