Frage

Ich habe große Probleme beim Entschlüsseln der Dokumentation von AppleUIManagedDocument , insbesondere die folgenden Methoden:

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

    Hat es jemand erfolgreich geschafft, zusätzlichen Inhalt im Verzeichnis "Zusätzlicher Inhalt" in seinen UIManagedDocument-Paketen zu speichern?Ich möchte gerade Bilder (PNGs, JPEGs usw.) und Videos (m4v usw.) in diesem Verzeichnis speichern, indem ich UUIDs als Dateinamen (mit der richtigen Dateierweiterung) verwende und Verweise auf diese einzelnen Dateien als generische Codetagcode-Dateipfade darin speicheremein beständiger Laden.

War es hilfreich?

Lösung

Gutschrift geht an Apple DTS für das Verständnis dieser Klasse.Ich teile einige der Beispiele, bei denen sie mir geholfen haben (leicht modifiziert).

OK, im Grunde funktioniert es also so: UIManagedDocument der Unterklasse und implementieren Sie die folgenden Methoden (wobei die extraInfo-Eigenschaft nur ein in unserer Unterklasse implementiertes NSDictionary ist):

- (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 ruft diese Methoden bei Bedarf auf und speichert automatisch alles, was Sie zum Speichern im Dokumentpaket in einem AdditionalContent-Verzeichnis benötigen.

Wenn Sie ein Speichern erzwingen müssen, rufen Sie einfach Folgendes auf Ihrer UIManagedDocument-Instanz auf:

[self updateChangeCount:UIDocumentChangeDone];

Derzeit verwende ich dies nicht für Bilder und Videos - aber das Beispiel sollte Ihnen genug geben, um loszulegen.

Andere Tipps

Die Dokumentation zu -additionalContentForURL: error: gibt an, dass die Rückgabe einer Null einen Fehler signalisieren soll.

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

Ich überschreibe -writeContents:andAttributes:safelyToURL:forSaveOperation:error: für einen anderen Zweck (indem ich beim ersten Speichern eines neuen Dokuments einige Dinge erledige), und das Aufrufen von super ruft die NSException-Götter auf, da der contents-Wert Null ist und kein NSDictionary, wie es von UIManagedDocument anscheinend erwartet wird.Hmm.

Je mehr Sie wissen ...

P.S.Ich denke, es hängt von der Tageszeit mit -writeContents: andAttributes ab: ... Es wurde einmal eine Ausnahme ausgelöst, die sich über die Erwartung eines NSDictionary beschwerte, aber später eine Ausnahme, die sich darüber beschwerte, dass ich keine NSData übergeben habe.Meine Augenbraue konnte nicht spockartiger hochgezogen werden als jetzt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top