Как сохранить дополнительный контент в мои файловые пакеты UIManagedDocument? - PullRequest
11 голосов
/ 02 декабря 2011

У меня много проблем с расшифровкой Документация Apple по UIManagedDocument, в частности следующие методы:

  • - (id)additionalContentForURL:(NSURL *)absoluteURL error:(NSError **)error
  • - (BOOL)readAdditionalContentFromURL:(NSURL *)absoluteURL error:(NSError **)error
  • - (BOOL)writeAdditionalContent:(id)content toURL:(NSURL *)absoluteURL originalContentsURL:(NSURL *)absoluteOriginalContentsURL error:(NSError **)error

Удалось ли кому-нибудь успешно сохранить дополнительный контент в каталог «дополнительный контент» внутри своих пакетов UIManagedDocument?Я хочу сохранить прямые изображения (PNG, JPEG и т. Д.) И видео (m4v и т. Д.) В этом каталоге, используя UUID в качестве имен файлов (с правильным расширением файла), и хранить ссылки на эти отдельные файлы в виде NSString файлапути в моем постоянном магазине.

Ответы [ 2 ]

12 голосов
/ 18 января 2012

Кредит идет к Apple DTS за помощь в понимании этого класса. Я поделюсь некоторыми примерами, с которыми они мне здесь помогли (слегка изменены).

ОК, так что в основном это работает так: подкласс UIManagedDocument и реализует следующие методы (где свойство extraInfo - это просто NSDictionary, реализованный в нашем подклассе):

- (BOOL)readAdditionalContentFromURL:(NSURL *)absoluteURL error:(NSError **)error
{
   NSURL *myURL = [absoluteURL URLByAppendingPathComponent:@"AdditionalInformation.plist"];
   self.extraInfo = [NSDictionary dictionaryWithContentsOfURL:myURL];
   return YES;
}

- (id)additionalContentForURL:(NSURL *)absoluteURL error:(NSError **)error
{
   if (!self.extraInfo) {
       return [NSDictionary dictionaryWithObjectsAndKeys: @"Picard", @"Captain", [[NSDate date] description], @"RightNow", nil];
   } else {
       NSMutableDictionary *updatedFriendInfo = [self.extraInfo mutableCopy];
       [updatedFriendInfo setObject:[[NSDate date] description] forKey:@"RightNow"];
       [updatedFriendInfo setObject:@"YES" forKey:@"Updated"];

       return updatedFriendInfo;
   }
}

- (BOOL)writeAdditionalContent:(id)content toURL:(NSURL *)absoluteURL originalContentsURL:(NSURL *)absoluteOriginalContentsURL error:(NSError **)error
{
   if (content) {
       NSURL *myURL = [absoluteURL URLByAppendingPathComponent:@"AdditionalInformation.plist"];
       [(NSDictionary *)content writeToURL:myURL atomically:NO];
   }

   return YES;
}

UIManagedDocument будет вызывать эти методы, когда это необходимо, автоматически сохраняя все, что вам нужно сохранить, в пакет документов в каталоге AdditionalContent.

Если вам нужно принудительно сохранить, просто позвоните в ваш экземпляр UIManagedDocument:

[self updateChangeCount:UIDocumentChangeDone];

В настоящее время я не использую это для изображений и видео - но пример должен дать вам достаточно, чтобы уйти.

3 голосов
/ 14 февраля 2012

Документация для -additionalContentForURL: error: указывает, что возвращение nil должно сигнализировать об ошибке.

  A return value of nil indicates an error condition. To avoid generating 
  an exception, you must return a value from this method. If it is not always
  the case that there will be additional content, you should return a sentinel value (for example, an NSNull instance) that you check for in
  writeAdditionalContent:toURL:originalContentsURL:error:.

Я переопределяю -writeContents:andAttributes:safelyToURL:forSaveOperation:error: для другой цели (выполняю некоторые вещи при первом сохранении нового документа) и вызов super вызывает богов NSException, потому что значение contents равно nil, а не NSDictionary, как казалось бы ожидаемым UIManagedDocument.Хм.

Чем больше вы знаете ...

PS Я полагаю, это зависит от времени суток с -writeContents: andAttributes: ... Однажды он выдал исключение с жалобой на ожидание NSDictionary, но позже бросил исключение, жалуясь, что я не передал ему NSData.Моя бровь не могла быть поднята более похожей на Спока, чем сейчас.

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