Ich verwende NSFileWrapper
für mein Paketdokument. Manchmal, wenn ich die Daten einer Datei im Paket anfrage, bekomme ich nil
. DieseNSFileWrapper gibt Null zurück, manchmal
ist, wie ich die Daten einer Datei innerhalb des Pakets abfragen:
- (NSData*) dataOfFile(NSString*)filename {
NSFileWrapper *fileWrapper = [self.documentFileWrapper.fileWrappers objectForKey:filename];
return fileWrapper.regularFileContents; // This returns nil sometimes. Why?
}
Diese Methode beginnt schließlich Null für einige Dateien Rückkehr (nicht alle). Leider ist es mir nicht gelungen, das Problem konsequent zu reproduzieren.
Falls es hilft, das ist, wie ich das Paket öffnen:
- (BOOL) readFromFileWrapper:(NSFileWrapper *)fileWrapper ofType:(NSString *)typeName error:(NSError *__autoreleasing *)outError {
self.documentFileWrapper = fileWrapper;
return YES;
}
Dies ist, wie ich die Daten einer Datei innerhalb des Pakets aktualisieren:
- (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];
}
Dies ist, wie ich sparen das Paket:
- (NSFileWrapper*) fileWrapperOfType:(NSString *)typeName error:(NSError *__autoreleasing *)outError {
return self.documentFileWrapper;
}
Warum kann das passieren? Gibt es einen Weg, das zu verhindern?
Die Dokumentation von regularFileContents
erscheint über dieses Problem zu sprechen:
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.
Aber ich verstehe nicht, was muss geändert werden in dem obigen Code zu verhindern, diese Situation.
Gescheiterte Versuche
Ich habe versucht, das Dokument, wenn regularFileContents
Rückkehr null Speicher, aber es gibt immer noch danach gleich Null. Gefällt mir:
- (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;
}
Dies ist eine verrückte Vermutung, aber ich frage mich, ob Spotlight die Dateiattribute ändert, nachdem Sie gespeichert haben (wie es die Datei oder etwas neu indiziert)? Ich bin ein wenig neugierig, warum Sie sparen, nachdem es versagt hat; warum nicht wieder öffnen? Raten Sie nur, um Ihnen ein paar Ideen zu geben. – Dad
Wild rate, aber ich denke, dein Objekt wird freigegeben. Vielleicht läuft etwas falsch mit dem Alloc. Hast du eine Analyse versucht? Sei vorsichtig mit alloc & init (und self. + Autorelease und release). – Roger