Как сохранить дополнительный контент в файловых пакетах UIManagedDocument?
У меня много проблем с расшифровкой документации AppleUIManagedDocument
в частности, следующие методы:
- (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 ответа
Благодарим 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];
В настоящее время я не использую это для изображений и видео - но пример должен дать вам достаточно, чтобы уйти.
Документация для -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. Моя бровь не могла быть поднята более похожей на Спока, чем сейчас.