NSFileWrapper
パッケージドキュメントに使用しています。パッケージ内のファイルのデータを要求すると、が表示されることがありますnil
。
これは、パッケージ内のファイルのデータをクエリする方法です。
- (NSData*) dataOfFile(NSString*)filename {
NSFileWrapper *fileWrapper = [self.documentFileWrapper.fileWrappers objectForKey:filename];
return fileWrapper.regularFileContents; // This returns nil sometimes. Why?
}
このメソッドは、最終的に一部のファイル(すべてではない)に対してnilを返し始めます。悲しいことに、私は問題を一貫して再現することができませんでした。
それが役立つ場合は、これが私がパッケージを開く方法です:
- (BOOL) readFromFileWrapper:(NSFileWrapper *)fileWrapper ofType:(NSString *)typeName error:(NSError *__autoreleasing *)outError {
self.documentFileWrapper = fileWrapper;
return YES;
}
パッケージ内のファイルのデータを更新する方法は次のとおりです。
- (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];
}
これが私がパッケージを保存する方法です:
- (NSFileWrapper*) fileWrapperOfType:(NSString *)typeName error:(NSError *__autoreleasing *)outError {
return self.documentFileWrapper;
}
なぜこれが起こっているのですか?それを防ぐ方法はありますか?
のドキュメントは、regularFileContents
この問題について説明しているようです。
readFromURL:options:error:またはinitWithURL:options:error:を呼び出した後、NSFileWrapperがファイルの内容を読み取る前に、ユーザーがファイルを変更すると、このメソッドはnilを返す場合があります。NSFileWrapperReadingImmediate readingオプションを使用して、その問題の可能性を減らします。
しかし、この状況を防ぐために上記のコードで何を変更する必要があるのかわかりません。
失敗した実験
nilを返す場合はドキュメントを保存しようとしましたregularFileContents
が、その後もnilが返されます。このような:
- (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;
}