Сохранить / записать NSMutableArray объектов на диск? - PullRequest
6 голосов
/ 29 октября 2009

Изначально я думал, что это сработает, но теперь я понимаю, что это не сработает, потому что artistCollection является NSMutableArray объектов "Artist".

@interface Artist : NSObject {
    NSString *firName;
    NSString *surName;
}

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

artistCollection = [[NSMutableArray alloc] init];

newArtist = [[Artist alloc] init];
[newArtist setFirName:objFirName];
[newArtist setSurName:objSurName];
[artistCollection addObject:newArtist];

NSLog(@"(*) - Save All");
[artistCollection writeToFile:@"/Users/Fgx/Desktop/stuff.txt" atomically:YES];

EDIT

Большое спасибо, только одна вещь, которая меня интересует. Если бы «Artist» содержал дополнительную переменную экземпляра NSMutableArray (softwareOwned) для других объектов (Applications), как бы я расширил кодировку, чтобы покрыть это? Могу ли я добавить NSCoding к объекту «Applications», затем закодировать его перед кодированием «Artist» или есть способ указать это в «Artist»?

@interface Artist : NSObject {
    NSString *firName;
    NSString *surName;
    NSMutableArray *softwareOwned;
}

@interface Application : NSObject {
    NSString *appName;
    NSString *appVersion;
}

большое спасибо

* 1016 Гэри *

Ответы [ 2 ]

18 голосов
/ 29 октября 2009

writeToFile:atomically: в классах коллекций Какао работает только для списков свойств, т. Е. Только для коллекций, которые содержат стандартные объекты, такие как NSString, NSNumber, другие коллекции и т. Д.

Чтобы уточнить ответ jdelStrother , вы можете архивировать коллекции, используя NSKeyedArchiver, если все объекты, содержащиеся в коллекции, могут архивировать сами. Чтобы реализовать это для вашего пользовательского класса, приведите его в соответствие с протоколом NSCoding:

@interface Artist : NSObject <NSCoding> {
    NSString *firName;
    NSString *surName;
}

@end


@implementation Artist

static NSString *FirstNameArchiveKey = @"firstName";
static NSString *LastNameArchiveKey = @"lastName";

- (id)initWithCoder:(NSCoder *)decoder {
    self = [super init];
    if (self != nil) {
        firName = [[decoder decodeObjectForKey:FirstNameArchiveKey] retain];
        surName = [[decoder decodeObjectForKey:LastNameArchiveKey] retain];
    }
    return self;
}   

- (void)encodeWithCoder:(NSCoder *)encoder {
    [encoder encodeObject:firName forKey:FirstNameArchiveKey];
    [encoder encodeObject:surName forKey:LastNameArchiveKey];
}

@end

С этим вы можете закодировать коллекцию:

NSData* artistData = [NSKeyedArchiver archivedDataWithRootObject:artistCollection];
[artistData writeToFile: @"/Users/Fgx/Desktop/stuff" atomically:YES];
9 голосов
/ 29 октября 2009

Посмотрите на NSKeyedArchiver. Кратко:

NSData* artistData = [NSKeyedArchiver archivedDataWithRootObject:artistCollection];
[artistData writeToFile: @"/Users/Fgx/Desktop/stuff" atomically:YES];

Вам нужно будет реализовать encodeWithCoder: в вашем классе Artist - см. Документы Apple

Разархивирование (см. NSKeyedUnarchiver) оставлено в качестве упражнения для читателя:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...