我正在使用iCloud创建一个应用程序。但我有一些问题。它使用NSFileWrapper在iCloud上创建目录,然后在NSFileWrapper目录中创建NSData(容器)文件。我正在使用此代码将NSFileWrapper转换为NSMutableArray:
NSFileWrapper *MyWrapper=[[[MyDocument data] fileWrappers] objectForKey:@"myFile.doh"];
NSData *MyData=[NSData dataWithData:[MyWrapper regularFileContents]];
NSMutableArray *MyList=[NSPropertyListSerialization propertyListFromData:MyData mutabilityOption:NSPropertyListMutableContainers format:nil errorDescription:nil];
它只能在创建此容器的设备上正常工作。在其他设备上,此代码的结果是BAD_ACCESS(在代码的第二行,我开始对数据执行某些操作)。在调试时,函数“regularFileContents”返回具有正确数据大小的正确对象,但是当我尝试读取此数据时,会发生BAD_ACEESS(代码= 10)。
我正在使用ARC,所以这不是内存管理的错误。
可能是某些项目/代码签名设置存在问题?有什么想法吗?
谢谢!
答案 0 :(得分:1)
我也遇到了这个问题,经过多次实验后我发现即使外包装已下载,内部内容还没有实际下载,导致对regularFileContents的调用失败。
我一直在MyWrapper上调用 startDownloadingUbiquitousItemAtURL ,一旦完成,错误就消失了。这是一种检查文件下载状态的方法(假设您知道MyWrapper的URL)并在尚未下载的情况下开始下载。
-(BOOL)downloadFileIfNotAvailable:(NSURL*)fileURL
{
NSNumber *isInCloud = nil;
if ([fileURL getResourceValue:&isInCloud forKey:NSURLIsUbiquitousItemKey error:nil])
{
if ([isInCloud boolValue]) {
NSNumber *isDownloaded = nil;
if ([fileURL getResourceValue:&isDownloaded forKey:NSURLUbiquitousItemIsDownloadedKey error:nil])
{
if ([isDownloaded boolValue])
{
return YES;
}
NSError *error = nil;
[[NSFileManager defaultManager] startDownloadingUbiquitousItemAtURL:fileURL error:&error];
if (error)
{
NSLog(@"Download Failed :: %@", error);
}
return NO;
}
}
}
return YES;
}