2013-02-27 3 views
2

현재 NSKeyedArchiver와 함께 사용되는 사용자 정의 클래스를 사용하는이 블로그를 사용하고 있습니다. 모든 것이 정확 하긴하지만 "학생"의 다른 사례를 얻는 방법을 궁금해합니다. 응용 프로그램이 종료 될 때이 튜토리얼에서는 NSKeyedArchiver에서 다른 인스턴스 찾기

http://keeptheseinmind.blogspot.com/2011/10/nskeyedarchiver-tutorial.html

은, 사용자 정의 클래스 "학생"의 새로운 인스턴스는 매번 생성됩니다. 그리고 NSKeyedArchiver 내에 이러한 "students"인스턴스가 많이 있다고 가정했지만 그 중 하나만 액세스 할 수 있습니다.

내가 잘못 오전마다 서로 덮어 쓰기하는 경우는, 각 시간 : 디스크에서 디스크로

- (void)loadDataFromDisk { 
    NSString *path = @"~/Documents/data"; 
    path = [path stringByExpandingTildeInPath]; 

    NSMutableDictionary *rootObject; 
    rootObject = [NSKeyedUnarchiver unarchiveObjectWithFile:path]; 

    if ([rootObject valueForKey:@"student"]) { 
     student = [rootObject valueForKey:@"student"]; 
    } 
} 

편집을

- (void)saveDataToDisk { 
    NSString *path = @"~/Documents/data"; 
    path = [path stringByExpandingTildeInPath]; 

    NSMutableDictionary *rootObject; 
    rootObject = [NSMutableDictionary dictionary]; 

    [rootObject setValue:student forKey:@"student"]; 

    [NSKeyedArchiver archiveRootObject:rootObject toFile:path]; 
} 

로드를 저장

신청이 해지됩니다. 재미있는 ...

그러나 내 목표는 하나 이상의 NSKeyedArchiver 내에서 "students"의 많은 인스턴스를 만드는 것입니다. 어떤 아이디어라도 크게 감사 할 것입니다.

답변

2

NSKeyedArchiver은 개체를 디스크에 저장 (직렬화)하는 방법으로 생각할 수 있습니다. 귀하의 경우에는, 그 객체는 정확히 하나의 키, student이있는 NSDictionary이다 (필자는 데이터 구조를 보여주기 위해 JSON 틱 표기법을 사용하고, 희망 의도는 분명하다) :

"student" : { "studentId" : 25, 
       "studentName" : "John Smith" 
      } 

당신은했듯이 당신이 saveDataToDisk로 전화 할 때마다, 그 하나의 "학생"키를 덮어 쓰는 것입니다. 한 명 이상의 학생을 구하기 위해 몇 가지 방법을 생각해 볼 수 있습니다. 선택할 방법은 데이터를 다시 읽는 방법에 따라 달라집니다.

하나의 옵션은 대신 NSDictionary의 배열을 저장하는 것입니다 :이 방법을 가지고가는 경우에

"student" : [ { "studentId: 25, "studentName" : "John Smith" }, 
       { "studentId: 26, "studentName" : "Jane Doe" } ] 

, 당신은 saveDataToDisk 학생들의 NSArray에 대한 액세스 권한을 보유하도록해야 할 것입니다 및 패스 그 대신 rootObject setValue:에 배열 : 또는

[rootObject setValue:students forKey:@"students"]; 

, 당신은 단지 사전에 더 많은 키를 추가하고자 상상할 수는 각각 학생 대표 :

,536,
"student25" : { "studentId: 25, "studentName" : "John Smith" }, 
"student26" : { "studentId: 26, "studentName" : "Jane Doe" } 

이 경우에도 저장 함수가 학생 배열에 액세스 할 수 있는지 확인해야하지만 이번에는 해당 배열을 반복하고 각각을 자체 키가있는 rootDictionary에 추가합니다 studentId와 "student"를 연결하는 (예를 들면) 구조로 만들었습니다.

+0

학생들의 배열 방법을 사용하고 싶습니다. 그러나 초과 근무 학생 수를 늘리고 싶습니다. 우리가 그것을 보관하고 싶을 때 반드시 준비가되지는 않을 것입니다. 먼저 archiveData 파일 안에있는 학생을보고 학생을 추가하고 싶습니다. 방금 파일을 압축 해제 한 다음 파일을 보관하여 파일을 저장하려고 시도했지만 그 위에 아카이브를 저장했지만 지금은 아무 것도 저장되지 않은 것처럼 보입니다. – freedom

+0

그러나, 내 필요에, 그냥 새로운 열쇠 방법론을 시도! Mucho Gracias! :) 위대한 아이디어! – freedom

+0

그리고 ... 그걸 얻은 후, NSMutableArray로 돌아가서 작동하게했습니다 :)! 먼저 NSMutableArray를 rootObject로 설정하고 addObject 메소드를 사용했습니다. 이 경우에는 키가 사용되어서는 안됩니다. – freedom