2009-12-10 3 views
3

각 과제에 대해 맞춤 과제 개체를 사용하는 숙제 앱을 만들고 있습니다. standardUserDefaults있는 NSMutableArray (NSWray를 통해 캐스팅 된 initWithArray :) 저장할 시도하고 있지만 저장 및 배열을 다시로드하는 데 문제가 있습니다.UserDefaults/KeyedArchiver 좌절

새로운 할당 (NewAssignmentViewController를로드)을 추가 할 수있는 테이블보기가 있습니다. 할당을 저장하면 AssigmentsViewController의 배열로 다시 푸시됩니다. 그런 다음 할당을 보여주는 UITableView를로드 할 때마다 호출합니다.

-(void)saveToUserDefaults:(NSArray*)myArray{ 
NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults]; 

if (standardUserDefaults) { 
    [standardUserDefaults setObject:[NSKeyedArchiver archivedDataWithRootObject:myArray] forKey:@"Assignments"]; 
    [standardUserDefaults synchronize]; 
    } 
} 

-(void)retrieveFromUserDefaults{ 
NSUserDefaults *currentDefaults = [NSUserDefaults standardUserDefaults]; 
NSData *dataRepresentingSavedArray = [currentDefaults objectForKey:@"Assignments"]; 
if (dataRepresentingSavedArray != nil) { 
    NSArray *oldSavedArray = [NSKeyedUnarchiver unarchiveObjectWithData:dataRepresentingSavedArray]; 
    if ([oldSavedArray count] != 0) { 
     [assignments setArray:[[NSMutableArray alloc] initWithArray:oldSavedArray]]; 
    } 
    else { 
     assignments = [[NSMutableArray alloc] initWithCapacity:100]; 
    } 
} 
} 
-(void)backButtonPressed { 
[self saveToUserDefaults:[[NSArray alloc] initWithArray:assignments]]; 
[self.navigationController popViewControllerAnimated:YES]; 
} 

이 도와주세요 : 여기

은 관련 코드입니다. 배열을로드하지는 않지만 오류는 발생하지 않습니다. UserDefault 또는 KeyedArchiver에 대한 정보는 일반적으로 크게 감사하겠습니다.

답변

0

이 방법으로 문제가 해결 될지 모르지만 배열을 NSData로 초기화하지 않아도됩니다. NSUserDefaults reference을 확인하면 배열이 유효한 기본 객체임을 알 수 있습니다. 여기 가지의

2

커플 : 내가 제대로 이해하면

것은, 당신이 상점에게 내용을 할당 객체가 배열을 시도하고 있습니다. 당신이 당신의 할당 객체에 대한 코드를 게시하지 않았기 때문에

- (void)encodeWithCoder:(NSCoder *)encoder; 
- (id)initWithCoder:(NSCoder *)decoder; 

: 당신이 NSUserDefaults에 저장 이러한 개체를 직렬화하려면

, 배정 자체가 이러한 방법을 재정 의하여 NSCoding 프로토콜을 준수해야하는 객체 , 당신이 이것을 제대로했는지 전혀 모른다면 dunno. 만약 당신이 개체를 인코딩 할 수 있어야합니다. 자세한 내용은 Archives and Serializations Programming Guide을 참조하십시오.

NSUserDefaults에 관해서는 독자가 기본적으로 응용 프로그램의 개체 모델을 저장하려고합니다. 최고의 아이디어는 아닙니다. NSUserDefaults는 기본 설정, 문자열, 범용 데이터의 스크랩과 같이 가벼운 지속 데이터와 함께 사용하는 것이 가장 좋습니다.

내가 수행 할 작업은 파일에 보관 된 데이터를 작성하고보기가로드 될 때로드하는 것입니다.

NSCoding을 준수 비교적 쉽게 또는 여러 개의 객체에서 아카이브를 만들기 :

여기에 그 주제에 Beginning iPhone Development에서 일부 코드입니다. 첫째, 우리가 NSMutableData 인스턴스로 객체를 보관하는 NSKeyedArchiver 인스턴스를 생성 한 후 인코딩 된 데이터를 보유하고 NSMutableData의 인스턴스 생성 : 그 모두를 생성 한 후

NSMutableData *data = [[NSMutableData alloc] init]; 
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data]; 

을, 우리는 다음 키 - 값을 사용 이와 같이, 우리는 아카이브에 포함 할 물건을 보관하는 코딩 :

[archiver encodeObject:myObject forKey:@”keyValueString”]; 

우리는 모든 개체를 인코딩하면 우리 포함시키려는 경우, 완료된 아카이버에게 파일 시스템에 NSMutableData 인스턴스를 작성하고 객체에 메모리 정리를 수행하면됩니다.

[archiver finishEncoding]; BOOL success = [data writeToFile:@”/path/to/archive” atomically:YES]; 
[archiver release]; 
[data release]; 

아카이브에서 개체를 재구성하기 위해, 우리는 유사한 과정을 통해 이동합니다. 보관 파일에서 NSData 인스턴스를 만들고 NSKeyedUnarchiver를 만들어 데이터를 디코딩합니다. NSData * data = [[NSData alloc] initWithContentsOfFile : path]; NSKeyedUnarchiver * unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData : data];

self.object = [unarchiver decodeObjectForKey:@”keyValueString”]; 

당신은 또한 당신의 application's documents directory이 파일을 저장하고로드받을 필요 것 : 는 그 후, 우리는 우리가 객체를 보관하는 데 사용되는 동일한 키를 사용하여 unarchiver에서 우리의 객체를 참조하십시오.

이 코드는 코드 스 니펫 (snippets)이 가득한 매우 유용한 책입니다. 끈기에 관한 장이 도움이 될 것입니다. 이 작업에 핵심 데이터를 사용하는 것이 훨씬 행복 할 수도 있습니다. 생각해보십시오.