Tôi đang sử dụng NSFileWrapper
cho tài liệu gói của mình. Đôi khi, khi tôi yêu cầu dữ liệu của một tệp bên trong gói, tôi nhận được nil
.NSFileWrapper trả về nil, đôi khi
Đây là cách tôi truy vấn dữ liệu của một tập tin bên trong gói:
- (NSData*) dataOfFile(NSString*)filename {
NSFileWrapper *fileWrapper = [self.documentFileWrapper.fileWrappers objectForKey:filename];
return fileWrapper.regularFileContents; // This returns nil sometimes. Why?
}
Phương pháp này cuối cùng bắt đầu trở về con số không đối với một số file (không phải tất cả). Đáng buồn thay, tôi đã không quản lý được vấn đề một cách nhất quán.
Trong trường hợp nó giúp, đây là cách tôi mở gói:
- (BOOL) readFromFileWrapper:(NSFileWrapper *)fileWrapper ofType:(NSString *)typeName error:(NSError *__autoreleasing *)outError {
self.documentFileWrapper = fileWrapper;
return YES;
}
Đây là cách tôi cập nhật dữ liệu của một tập tin bên trong gói:
- (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];
}
Đây là cách tôi lưu gói:
- (NSFileWrapper*) fileWrapperOfType:(NSString *)typeName error:(NSError *__autoreleasing *)outError {
return self.documentFileWrapper;
}
Tại sao điều này có thể xảy ra? Có cách nào để ngăn chặn nó không?
Các tài liệu của regularFileContents
xuất hiện để nói về vấn đề này:
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.
Nhưng tôi không hiểu những gì đã được thay đổi trong đoạn code trên để ngăn chặn tình trạng này.
Experiments Không
tôi đã cố gắng tiết kiệm tài liệu nếu regularFileContents
trở lại con số không nhưng nó vẫn trả về nil sau đó. Như thế này:
- (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;
}
Đây là một dự đoán điên rồ, nhưng tôi tự hỏi liệu đèn chiếu có sửa đổi các thuộc tính tệp sau khi bạn lưu (giống như nó reindexes tệp hay gì đó) không? Tôi là một chút tò mò lý do tại sao bạn đang tiết kiệm sau khi nó không thành công; tại sao không mở lại nó? Chỉ cần đoán để thử và cung cấp cho bạn một số ý tưởng. – Dad
Đoán hoang dã, nhưng tôi nghĩ rằng đối tượng của bạn được phát hành. Có thể đã xảy ra sự cố với phân bổ. Bạn đã thử phân tích chưa? Hãy cẩn thận với phân bổ & init (và tự. + Autorelease và phát hành). – Roger