Domanda

Ho molti problemi a decifrare la documentazione di Apple in giroUIManagedDocument , in particolare i seguenti metodi:

  • - (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

Qualcuno è riuscito a salvare con successo contenuto aggiuntivo nella directory "contenuto aggiuntivo" all'interno dei propri pacchetti UIManagedDocument?Sto cercando di salvare immagini semplici (PNG, JPEG, ecc.) E video (m4v, ecc.) In questa directory utilizzando UUID come nomi di file (con l'estensione file corretta) e memorizzando i riferimenti a questi singoli file come percorsi di file NSString all'internoil mio negozio persistente.

È stato utile?

Soluzione

Il merito va a Apple DTS per avermi aiutato a capire questo corso.Condivido alcuni degli esempi con cui mi hanno aiutato qui (leggermente modificati).

OK, quindi fondamentalmente funziona in questo modo: sottoclasse UIManagedDocument e implementa i seguenti metodi (dove la proprietà extraInfo è solo un NSDictionary implementato nella nostra sottoclasse):

- (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 chiamerà questi metodi quando necessario, salvando automaticamente tutto ciò che è necessario salvare nel pacchetto del documento all'interno di una directory AdditionalContent.

Se devi forzare un salvataggio, chiama semplicemente quanto segue sulla tua istanza UIManagedDocument:

[self updateChangeCount:UIDocumentChangeDone];

Al momento, non lo sto usando per immagini e video, ma l'esempio dovrebbe darti abbastanza per iniziare.

Altri suggerimenti

La documentazione per -additionalContentForURL: error: indica che la restituzione di uno zero dovrebbe segnalare un errore.

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

Eseguo l'override di -writeContents:andAttributes:safelyToURL:forSaveOperation:error: per un altro scopo (facendo alcune cose al primo salvataggio di un nuovo documento) e la chiamata super invoca gli dei NSException perché il valore di contents è nullo, non un NSDictionary come apparentemente previsto da UIManagedDocument.Hmm.

Più ne sai ...

P.S.Immagino che dipenda dall'ora del giorno con -writeContents: andAttributes: ... Una volta ha lanciato un'eccezione lamentandosi di aspettarsi un NSDictionary, ma in seguito ha lanciato un'eccezione lamentandosi che non gli avevo passato un NSData.Il mio sopracciglio non potrebbe essere sollevato in modo più simile a Spock di quanto non sia adesso.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top