我正在使用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 读取选项来降低出现该问题的可能性。
但我不明白在上面的代码中必须改变什么来防止这种情况。
失败的实验
如果返回 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;
}