Sto usando NSFileWrapper
per il mio documento del pacchetto. A volte, quando richiedo i dati di un file all'interno del pacchetto ottengo nil
.NSFileWrapper restituisce nil, a volte
Questo è quanto ho interrogare i dati di un file all'interno del pacchetto:
- (NSData*) dataOfFile(NSString*)filename {
NSFileWrapper *fileWrapper = [self.documentFileWrapper.fileWrappers objectForKey:filename];
return fileWrapper.regularFileContents; // This returns nil sometimes. Why?
}
Questo metodo finalmente inizia il ritorno a zero per alcuni file (non tutti). Purtroppo, non sono riuscito a riprodurre il problema in modo coerente.
In caso aiuta, questo è come apro il pacchetto:
- (BOOL) readFromFileWrapper:(NSFileWrapper *)fileWrapper ofType:(NSString *)typeName error:(NSError *__autoreleasing *)outError {
self.documentFileWrapper = fileWrapper;
return YES;
}
Questo è quanto ho aggiornare i dati di un file all'interno del pacchetto:
- (void) updateFile:(NSString*)filename withData:(NSData*)data {
SBFileWrapper *fileWrapper = [self.documentFileWrapper.fileWrappers objectForKey:filename];
if (fileWrapper) {
[self.documentFileWrapper removeFileWrapper:fileWrapper];
}
NSFileWrapper *fileWrapper = [[SBFileWrapper alloc] initRegularFileWithContents:data ];
fileWrapper.preferredFilename = filename;
[self.documentFileWrapper addFileWrapper:fileWrapper];
}
Questo è il modo risparmio il pacchetto:
- (NSFileWrapper*) fileWrapperOfType:(NSString *)typeName error:(NSError *__autoreleasing *)outError {
return self.documentFileWrapper;
}
Perché questo può accadere? C'è un modo per prevenirlo?
La documentazione di regularFileContents
sembra di parlare di questo problema:
This method may return nil if the user modifies the file after you call readFromURL:options:error: or initWithURL:options:error: but before NSFileWrapper has read the contents of the file. Use the NSFileWrapperReadingImmediate reading option to reduce the likelihood of that problem.
Ma io non capisco cosa deve essere cambiato nel codice qui sopra per evitare questa situazione.
esperimenti falliti
Ho cercato di salvare il documento se regularFileContents
ritorno pari a zero, ma restituisce comunque pari a zero in seguito. In questo modo:
- (NSData*) dataOfFile(NSString*)filename {
NSFileWrapper *fileWrapper = [self.documentFileWrapper.fileWrappers objectForKey:filename];
NSData *data = fileWrapper.regularFileContents;
if (!data) {
[self saveDocument:nil];
fileWrapper = [self.documentFileWrapper.fileWrappers objectForKey:filename];
data = fileWrapper.regularFileContents;
}
return data;
}
Questa è una ipotesi pazzesca, ma mi chiedo se riflettori stia modificando gli attributi del file dopo il salvataggio (come reindicizza il file o qualcosa del genere)? Sono un po 'curioso perché stai salvando dopo che fallisce; perché non riaprirlo invece? Sto solo cercando di darti qualche idea. – Dad
Immaginazione selvaggia, ma penso che il tuo oggetto venga rilasciato. Forse qualcosa va storto con l'alloc. Hai provato un'analisi? Fai attenzione con alloc e init (e self. + Autorelease e release). – Roger