4

我正在使用 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(code=10)。

我正在使用 ARC,所以这不是内存管理的错误。

问题可能出在某些项目/代码符号设置中?有任何想法吗?

谢谢!

4

1 回答 1

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;
}
于 2012-06-30T05:07:28.247 回答