我在将NSFileWrapper文档与iCloud同步时遇到问题。我能够创建我的包装并将其保存到我无处不在的容器中。
当我尝试从创建它的设备中读取它时,它可以工作。当我尝试从iCloud读取另一台设备时,它会崩溃。
一些代码:
此函数用于添加带有NSString的包装容器
- (void) addNSString:(NSString*)_string toFileWrapper:(NSFileWrapper*)_wrapper forKey:(NSString*)_key {
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:_string];
if(data) {
[_wrapper addRegularFileWithContents:data preferredFilename:_key];
}
}
接下来就是我如何解码它:
- (id) unarchiveObjectFromWrappers:(NSDictionary*)_wrappers withKey:(NSString*)_key {
id value = nil;
NSFileWrapper *wrapper = [_wrappers valueForKey:_key];
if(wrapper) {
NSData *data = [wrapper regularFileContents];
if(data) {
value = [NSKeyedUnarchiver unarchiveObjectWithData:data];
}
}
return value;
}
解码部分在一个设备上工作而不在其他设备上工作(当NSKeyedUnarchiver尝试从NSData解压缩时,EXC_BAD_ACCESS。NSData似乎很好,它具有适当的长度和一切,但是当我尝试记录其数据时,例如它崩溃)。
我的猜测是,NSFileWrapper不下载其全部内容,只下载其结构,我必须做一些事情才能使其可用。但我不知道是什么。
有什么想法吗?
======
编辑:
NSURLUbiquitousItemIsDownloadedKey表示文件已下载但是如果我尝试将其复制到沙箱中,则会因此错误而失败:“操作无法完成。错误的文件描述符”
因此文件未正确上传到iCloud或未正确下载...
答案 0 :(得分:1)
它也让我发疯了。解决方案相当简单,但完全没有Apple的记录。您必须专门下载该文件。仅自动下载文件包装器,但不会下载其内容。这就是支票说文件存在的原因。
在复制文件之前,请调用以下内容:
[[NSFileManager defaultManager]startDownloadingUbiquitousItemAtURL:cloudURL error:nil];
相关:Cannot sync simple text file with iCloud (bad file descriptor)