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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top