2016-11-13 3 views
0

사용자 정의 클래스 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 
+0

처음 두 줄의 코드에서 두 개의 불필요한 배열 객체를 만들었습니다. 그리고 arrayByAddingObject가 있습니다. 또 하나는 saveItemsArray에 있습니다. 동기화를 호출 할 필요가 없습니다. – gnasher729

답변

1

코드와 몇 가지 문제가 있습니다.

itemsArray 메서드는 실제로 일부 데이터를 저장할 때까지 nil을 반환합니다. 그래서 제대로 처리해야합니다. saveItemsArray: 메서드는 불필요하게 배열 복사본을 만들고 불필요하게 synchronize으로 호출합니다.

+ (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]; 
} 

그리고이 두 가지 방법을 호출하는 코드 SDGridItemCacheTool.m

업데이트

몇 가지 정리를 필요로한다.

NSData* data = [NSKeyedArchiver archivedDataWithRootObject:_deviceInfo]; 

NSMutableArray *temp = [[SDGridItemCacheTool itemsArray] mutableCopy]; 
[temp addObject:data]; 
[SDGridItemCacheTool saveItemsArray:temp]; 

NSMutableArray를 만든 다음 그것을 대체 할 필요가 없었다. 그리고 배열을 복사 할 필요가 없습니다.

깨끗한 사용자 기본값으로 시작하려면 앱을 삭제했다가 다시 설치하고 싶을 수도 있습니다. 이 코드를 조금 변경했다면 이전 코드의 해당 키에 배열이 아닌 배열이 저장되어있을 수 있습니다.

+0

답변 해 주셔서 감사합니다! 사용자 기본값을 정리하는 방법에 대한 지침을 알려주십시오. 그리고 사용자가 기본으로 변경할 수있는 객체를 저장하면 몇 가지 문제가 발생할 수 있으므로 배열의 복사본을 사용한다고하는 사람들이 있습니다. –

+0

"너 어디 선가있어?"너는 넌센스를 보았다. – gnasher729

+0

앱을 삭제하고 다시 설치하여 사용자 기본값을 정리합니다. 그리고 예, 변경 가능한 객체를 사용자 기본값에 저장하면 문제가 발생할 수 있다는 것은 의미가 없습니다. – rmaddy

관련 문제