2011-12-02 9 views
11

Sto avendo un sacco di problemi decifrare Apple's documentation around UIManagedDocument, in particolare i seguenti metodi:Come posso salvare contenuto aggiuntivo nei miei pacchetti di file UIManagedDocument?

  • - (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 ha gestito con successo per salvare contenuti aggiuntivi nella " contenuto aggiuntivo "nella directory dei loro pacchetti UIManagedDocument? Sto cercando di salvare immagini dirette (PNG, JPEG, ecc.) E video (m4v, ecc.) In questa directory usando gli UUID come nomi di file (con l'estensione corretta) e memorizzando i riferimenti a questi singoli file come percorsi di file NSString all'interno di il mio negozio persistente.

+0

Avete avuto fortuna con questo? Sto guardando la stessa cosa. –

risposta

12

Il credito va a Apple DTS per avermi aiutato a capire questa lezione. Sto condividendo alcuni degli esempi con cui mi hanno aiutato qui (leggermente modificato).

OK, quindi fondamentalmente funziona così: sottoclasse UIManagedDocument, e implementare i metodi seguenti (in cui la proprietà extraInfo è solo un NSDictionary implementato sul nostro 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 si necessario, salvando automaticamente tutto ciò che è necessario salvare nel pacchetto del documento all'interno di una directory AdditionalContent.

Se è necessario forzare un salvataggio, è sufficiente chiamare il seguente sul UIManagedDocument esempio:

[self updateChangeCount:UIDocumentChangeDone]; 

Allo stato attuale, non sto usando questo per immagini e video - ma l'esempio dovrebbe dare sufficiente per andare via.

+0

Grande, grazie per questo! L'unica cosa di cui non sono sicuro è la gestione dei file (ad esempio foto, mp3, ecc.) Che verranno allegati al documento. È tutto fatto manualmente coordinando l'accesso ai file nella directory del contenuto aggiuntivo del file wrapper del documento? –

+1

Quindi, in pratica, il modo in cui avrei dovuto gestirlo era leggere/scrivere NSURL dei file arbitrari in un array collegato alla sottoclasse UIManagedDocument. Quando viene chiamato il metodo 'readAdditionalContentFromURL: error:', ottieni un elenco degli URL sul disco e memorizzalo.Probabilmente dovresti associare una qualche forma di cache alla sottoclasse che hai scaricato ogni volta che 'writeAdditionalContent: toURL: originalContentsURL: error:' è chiamato per scrivere effettivamente le foto/mp3s/et al su disco. È possibile scegliere di archiviare i file in una directory temporanea fino a quando si verifica questo svuotamento. –

+1

Non riuscivo a vedere un modo molto pulito per fare questo, quindi dato che ho scelto iOS 5 e versioni successive per questo progetto ho abilitato l'archiviazione esterna delle proprietà binarie nel mio negozio Core Data, e spingo le immagini e i video nel mio persistente memorizzare piuttosto che la directory del contenuto aggiuntivo. Finora, questo è stato un ragionevole compromesso e non ho riscontrato alcun problema con le prestazioni o il comportamento (conosco altri con memoria esterna). Scusa, non è una risposta perfetta, ma come molte API aggiunte con iCloud non penso che Apple abbia finito di documentare^H^H^H^H^H^H^H^H^H^H^H loro. –

3

La documentazione per -additionalContentForURL: errore: indica che restituire un nil 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:. 

sovrascrivo -writeContents:andAttributes:safelyToURL:forSaveOperation:error: per un altro scopo (fare alcune cose al primo salvataggio di un nuovo documento), e chiamando eccellente invoca gli dei NSException perché contents valore è pari a zero, non un NSDictionary di apparentemente previsto dalla UIManagedDocument. Hmm.

Quanto più si sa ...

P.S. Immagino 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 del fatto che non l'ho passato a NSData. Il mio sopracciglio non poteva essere cresciuto in un modo più simile a Spock di quello che è adesso.

Problemi correlati