iCloud - Как сохранить архив, содержащий массив пользовательских объектов - PullRequest
4 голосов
/ 12 декабря 2011

Я разработал небольшое приложение, которое хранит локально в iOS посредством архивации массива пользовательских объектов, содержащего:

@property (nonatomic, copy) NSString    *name;
@property (nonatomic, copy) NSString    *dateCreated;
@property (nonatomic, copy) NSString    *desc;
@property (nonatomic, copy) NSString    *url;

Я хочу синхронизировать указанный архив с помощью iCloud, и я считаю, что рекомендуемый механизм - через UIDocumentподкласс.Все примеры UIDocument, которые я обнаружил, использовали один экземпляр с одной единственной строкой NSString, поэтому меня немного смущает, как выполнить синхронизацию целого массива пользовательских объектов, но используя UIDocument (как я это делаю сегодня локально с помощью NSCoding).

Должен ли я создать массив объектов UIDocument, содержащий свойства, перечисленные выше, должен ли я создать экземпляр UIDocument, содержащий 1 экземпляр объекта данных, описанного выше, а затем создать массив, содержащий все экземпляры, или один отдельный UIDocument должен содержать полный массивпользовательские объекты?

Я провел некоторые исследования, но все еще в замешательстве.В конце мне нужно будет синхронизировать только 1 файл, содержащий массив указанных пользовательских объектов.

Заранее спасибо за помощь

Сегодня у меня есть пользовательский класс, описанный выше, с 4 строками, называемыми Snippet, и в моем контроллере Root-представления у меня есть список NSMutableArray, в который я добавляю каждыйновый экземпляр этого класса Snippet.

self.list = [[NSMutableArray alloc] init];
Snippet *newEntry = [[Snippet alloc] init];
[self.list addObject:newEntry];

Должен ли я создать подкласс UI Document, которому принадлежит массив пользовательских объектов?

1 Ответ

2 голосов
/ 12 декабря 2011

Пример в документации действительно показывает подкласс UIDocument, который имеет только одну строку, но возвращает NSData из -contentsForType:error:.Вы можете хранить сколько угодно объектов в NSData, используя NSKeyedArchiver.Прочитайте Сериализация объектов , чтобы узнать, как кодировать объекты с помощью NSKeyedArchiver (и продолжайте читать, чтобы узнать, как их вернуть!).

Использование ваших свойств в качестве примера ...

@interface MyDocument : UIDocument
{
}
@property (nonatomic, copy) NSString    *name;
@property (nonatomic, copy) NSString    *dateCreated;
@property (nonatomic, copy) NSString    *desc;
@property (nonatomic, copy) NSString    *url;
@end

@implementation MyDocument

//...

- (id)contentsForType:(NSString *)typeName error:(NSError **)outError
{
    NSMutableData *data = [NSMutableData data];
    NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
    [archiver encodeObject:name forKey:@"name"];
    [archiver encodeObject:dateCreated forKey:@"created"];
    [archiver encodeObject:desc forKey:@"desc"];
    [archiver encodeObject:url forKey:@"url"];
    [archiver finishEncoding];
    // release archiver if you're not using ARC
    return data;
}
@end;

ВНИМАНИЕ: я не скомпилировал код выше, поэтому никаких гарантий.Это должно послужить примером для иллюстрации использования архиватора для хранения нескольких объектов в одном объекте данных, который вы можете вернуть в качестве содержимого вашего документа.

...