Comment puis-je enregistrer du contenu supplémentaire dans mes paquets de fichiers UIManagedDocument?

StackOverflow https://stackoverflow.com/questions/8351948

Question

Je vais avoir beaucoup de mal à déchiffrer la documentation Apple autour UIManagedDocument , en particulier les procédés suivants:

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

Quelqu'un at-il réussi à enregistrer le contenu supplémentaire dans le répertoire « contenu d'addition » à l'intérieur de leurs forfaits UIManagedDocument? Je suis à la recherche d'enregistrer des images droites (PNGs, JPEG, etc.) et des vidéos (M4V, etc) dans ce répertoire en utilisant UUID comme les noms de fichiers (avec l'extension de fichier correct), et stocker des références à ces fichiers individuels que les chemins de fichiers NSString dans mon magasin persistant.

Était-ce utile?

La solution

Le crédit va à d'Apple DTS pour me aider à comprendre cette classe. Je partage une partie de l'exemple, ils me ont aidé ici (légèrement modifié).

OK, donc en gros cela fonctionne comme ceci: sous-classe UIManagedDocument, et mettre en œuvre les méthodes suivantes (où la propriété extraInfo est juste un NSDictionary mis en œuvre sur notre sous-classe):

- (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 appellera ces méthodes quand il a besoin, enregistrer automatiquement tout ce que vous devez enregistrer au paquet de documents dans un répertoire AdditionalContent.

Si vous avez besoin de forcer une sauvegarde, il suffit d'appeler ce qui suit sur votre instance UIManagedDocument:

[self updateChangeCount:UIDocumentChangeDone];

À l'heure actuelle, je ne suis pas en utilisant pour des images et des vidéos -. Mais l'exemple devrait vous donner assez pour partir

Autres conseils

La documentation -additionalContentForURL: erreur:. Indique que le retour d'un nul supposé signaler une erreur

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

Je -writeContents:andAttributes:safelyToURL:forSaveOperation:error: passer outre à d'autres fins (faire des choses sur le premier enregistrement d'un nouveau document), et appelant super invoque les dieux NSException parce que la valeur de contents est nul, pas NSDictionary comme apparemment prévu par UIManagedDocument. Hmm.

Plus vous en savez ...

P.S. Je suppose que cela dépend du moment de la journée avec -writeContents: andAttributes: ... Il était une fois lancé une exception se plaindre attendant une NSDictionary, mais plus tard a lancé une exception se plaindre que je ne transmets une NSData. Mon sourcil ne pouvait être soulevée dans un plus semblable à la mode Spock qu'il est en ce moment.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top