Como faço para salvar o conteúdo adicional para os meus pacotes de arquivos UIManagedDocument?
-
27-10-2019 - |
Pergunta
Estou tendo um monte de problemas para decifrar torno documentação do a Apple UIManagedDocument
, especificamente os seguintes métodos:
-
- (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
Alguém já conseguiu com sucesso para salvar o conteúdo adicional para o diretório "content disso" dentro de seus pacotes UIManagedDocument? Eu estou olhando para salvar imagens em linha reta (PNGs, JPEGs, etc) e vídeos (m4v, etc) para este diretório usando UUIDs como os nomes de arquivo (com a extensão de arquivo correto), e armazenar as referências a esses arquivos individuais como caminhos de arquivo NSString
dentro minha loja persistente.
Solução
O crédito vai para a Apple DTS por me ajudar a entender essa classe. Estou compartilhando alguns dos exemplo que ajudou me com aqui (ligeiramente modificada).
OK, então basicamente funciona assim: UIManagedDocument
subclasse e implementar os seguintes métodos (onde a propriedade extraInfo
é apenas um NSDictionary implementado em nosso subclasse):
- (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
vai chamar esses métodos quando ele precisa, automaticamente salvar o que você precisa para salvar o pacote de documentos dentro de um diretório AdditionalContent
.
Se você precisa forçar uma gravação, basta ligar para o seguinte em sua instância UIManagedDocument
:
[self updateChangeCount:UIDocumentChangeDone];
No momento, eu não estou usando isso para imagens e vídeos -. Mas o exemplo deve dar-lhe o suficiente para ir off
Outras dicas
A documentação para -additionalContentForURL: erro:. Indica que retornar um nulo deveria sinalizar um erro
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:.
I substituir -writeContents:andAttributes:safelyToURL:forSaveOperation:error:
para outra finalidade (fazendo algumas coisas na primeira gravação de um novo documento), e chamando de super invoca os deuses NSException porque o valor contents
é nulo, e não um NSDictionary aparentemente tão esperado pelos UIManagedDocument. Hmm.
Quanto mais você sabe ...
P.S. Eu acho que depende da hora do dia com -writeContents: andAttributes: ... Ele já emitiu uma exceção reclamando esperando um NSDictionary, mas mais tarde lançou uma exceção reclamando que eu não passá-lo um NSData. Minha sobrancelha não poderia ser criado em um mais Spock-como a moda do que é agora.