Pregunta

Tengo muchos problemas para descifrar documentación de Apple sobreUIManagedDocument , específicamente los siguientes 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

¿Alguien ha logrado guardar contenido adicional en el directorio de "contenido adicional" dentro de sus paquetes UIManagedDocument?Estoy buscando guardar imágenes directas (PNG, JPEG, etc.) y videos (m4v, etc.) en este directorio usando UUID como nombres de archivo (con la extensión de archivo correcta), y almacenar referencias a estos archivos individuales como rutas de archivo NSString dentromi tienda persistente.

¿Fue útil?

Solución

El crédito es para Apple DTS por ayudarme a comprender esta clase.Estoy compartiendo algunos de los ejemplos con los que me ayudaron aquí (modificado ligeramente).

Bien, básicamente funciona así: subclase UIManagedDocument e implementa los siguientes métodos (donde la propiedad extraInfo es solo un NSDictionary implementado en nuestra subclase):

- (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 llamará a estos métodos cuando sea necesario, guardando automáticamente todo lo que necesite guardar en el paquete de documentos dentro de un directorio AdditionalContent.

Si necesita forzar un guardado, simplemente llame a lo siguiente en su instancia UIManagedDocument:

[self updateChangeCount:UIDocumentChangeDone];

Por el momento, no estoy usando esto para imágenes y videos, pero el ejemplo debería darte lo suficiente para disparar.

Otros consejos

La documentación para -additionalContentForURL: error: indica que devolver un nil supuestamente indica un error.

  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:.

Anulo -writeContents:andAttributes:safelyToURL:forSaveOperation:error: para otro propósito (hacer algunas cosas en la primera vez que se guarda un nuevo documento), y llamar a super invoca los dioses NSException porque el valor de contents es nil, no un NSDictionary como aparentemente esperaba UIManagedDocument.Hmm.

Cuanto más sepa ...

P.S.Supongo que depende de la hora del día con -writeContents: andAttributes: ... Una vez lanzó una excepción quejándose de esperar un NSDictionary, pero luego lanzó una excepción quejándose de que no le pasé un NSData.Mi ceja no podría levantarse de una manera más parecida a la de Spock de lo que está ahora.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top