내 패키지 문서에 NSFileWrapper
을 사용하고 있습니다. 때로는 패키지 안에있는 파일의 데이터를 요청하면 nil
이됩니다.NSFileWrapper가 nil을 반환하는 경우가 있음
이 내가 패키지 내부의 파일의 데이터를 쿼리하는 방법입니다
- (NSData*) dataOfFile(NSString*)filename {
NSFileWrapper *fileWrapper = [self.documentFileWrapper.fileWrappers objectForKey:filename];
return fileWrapper.regularFileContents; // This returns nil sometimes. Why?
}
이 방법은 결국 일부 파일 (모든)에 대한 무기 호를 반환 시작합니다. 슬프게도 문제를 일관되게 재현 할 수 없었습니다.
- (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;
}
왜 이런 일이 벌어 질 수 있습니까? 그것을 막을 수있는 방법이 있습니까?
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.
그러나 나는 이러한 상황을 방지하기 위해 위의 코드를 변경해야하는 것을 이해하지 않습니다
는regularFileContents
의 문서는이 문제에 대해 얘기를 나타납니다.
실패 실험
나는 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;
}
이것은 미친 생각이지만 파일을 다시 색인하는 것처럼 저장 후 스포트라이트가 파일 속성을 수정하고 있는지 궁금합니다. 나는 실패한 후에 왜 절약하고 있는지 약간 궁금하다. 대신 왜 다시 열지 않으시겠습니까? 그냥 당신에게 몇 가지 아이디어를 줄 추측. – Dad
짐작 하겠지만, 당신의 물건이 풀려나는 것 같아요. 어쩌면 alloc에 문제가 생길 수 있습니다. 분석을 시도 했습니까? alloc & init (와 self. + autorelease와 release)에주의하라. – Roger