2013-02-27 6 views
2

В настоящее время я использую этот блог, где он использует пользовательские классы, использующиеся в NSKeyedArchiver. Все кажется правильным, но мне интересно, как получить разные экземпляры «ученика».Поиск различных экземпляров в NSKeyedArchiver

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

В этом учебнике, новые экземпляры пользовательского класса «студентов» создаются каждый раз, когда приложение завершается. И я предположил, что в NSKeyedArchiver есть много таких «ученических» экземпляров, но я могу получить доступ только к одному из них.

Сохранение на диск

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

    NSMutableDictionary *rootObject; 
    rootObject = [NSMutableDictionary dictionary]; 

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

    [NSKeyedArchiver archiveRootObject:rootObject toFile:path]; 
} 

Загрузка с диска

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

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

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

EDIT:

Я ошибаюсь, экземпляры каждый раз перезаписываться друг друга, каждый раз, приложение прекращается. Интересно ...

Однако моя цель состоит в том, чтобы создать много примеров «учеников» в одном или нескольких NSKeyedArchiver. Любые идеи очень приветствуются.

ответ

2

Вы можете думать о NSKeyedArchiver как о способе сохранения объекта (сериализации) на диск. В вашем случае, этот объект является NSDictionary, что имеет ровно один ключ, student (я использую 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"]; 

в качестве альтернативы, вы можете себе представить, желающие просто добавить дополнительные ключи к словарю, каждый из которых представляет студент:

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

В этом случае вам также необходимо убедиться, что ваша функция сохранения имеет доступ к массиву студентов, но на этот раз вы перейдете через этот массив и добавите каждый из них в rootDictionary со своим собственным ключом которую вы строите (например), объединяя «студент» со студентом.

+0

Я хотел бы использовать массив методов студентов. Тем не менее, я хотел бы построить количество студентов сверхурочно; который, не обязательно будет готов, когда мы захотим его заархивировать. Сначала я хотел бы видеть студентов в файле archiveData, а затем добавить ученика. Я просто попытался сделать это, разобрав его (если файл существует), затем архивируйте поверх этого, но кажется, что сейчас ничего не сохраняется. – freedom

+0

Однако, с моими потребностями, просто попробовал новую методологию ключей! Мучо Грасиас! :) Отличная идея! – freedom

+0

и ... после получения этого, я вернулся в NSMutableArray и получил его работу :)! Во-первых, я установил NSMutableArray в rootObject и просто использовал метод addObject. в этом случае не должно быть ключей. – freedom