3

我正在为一些项目编写一个简单的 iCloud 管理器。

目前我有一个小的测试代码来查看我的经理是否成功地将文件从设备的本地存储中逐出(并且不会从 iCloud 存储中删除它们)。为此,文档说明您使用:

evictUbiquitousItemAtURL:错误:

删除指定的基于云的项目的本地副本。

我的测试片段如下所示:

if ([self evictLocaleFile:@"myTestFile.txt"])
    NSLog(@"File was evicted successfully!");

[self listAllLocalFiles];

这里的想法是我首先驱逐指定的文件,然后列出本地 iCloud 文件夹中的本地文件,看看它是否仍然存在。

第一种方法简单地逐出指定的文件,如下所示:

-(BOOL) evictLocaleFile:(NSString *)name
{
     NSURL *deletionURL = [[NSURL alloc] initFileURLWithPath:[ubiquityContainerURL path]];

     deletionURL = [deletionURL URLByAppendingPathComponent:@"Documents" isDirectory:YES];
     deletionURL = [deletionURL URLByAppendingPathComponent:name isDirectory:NO];
     NSLog(@"EVICTION URL: %@", deletionURL.path);

     NSError* err = nil;

     BOOL didEvict = [[NSFileManager defaultManager] evictUbiquitousItemAtURL:deletionURL error:&err];

     if (err != nil)
     {
         NSLog(@"Eviction error: %@", err.description);
     }

     return didEvict;
}

列出本地文件的方法如下所示:

-(NSArray*) listAllLocalFiles
{
     NSString *localPath = [[ubiquityContainerURL path] stringByAppendingFormat:@"/Documents"];

     NSLog(@"PATH: %@", localPath);

     NSArray* files = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:localPath error:nil];

     for (NSString* fileName in files)
     {
         NSLog(@"FILE %@", fileName);
     }

     return files;
}

现在奇怪的是,当我执行程序时,它确实声明它成功驱逐了文件。但是该文件仍然在语言环境文件下列为存在?此时文件不应该被完全删除并且不存在吗?我不确定为什么该文件没有被删除。

我什至尝试先将文件保存下来,然后关闭 WIFI 并再次运行代码以确保不是因为 iCloud 强制再次下载文件,但这并没有解决问题。

任何人都知道会发生什么?

4

2 回答 2

3

你试过NSFileManager了吗removeItemAtURL:error:

我使用这种方法从 iCloud 中删除文件,效果很好。

根据evictUbiquitousItemAtURL:error:描述的文档,它仅删除指定的基于云的项目的本地副本。

于 2012-09-27T14:35:29.027 回答
3

所以我发现了问题所在。

我的代码实际上是正确地从我的本地设备中逐出文件。这是由于误解了 ubiquity 容器实际上是如何代表我工作的。我的印象是每个应用程序都有一个本地 ubiquity 容器,它显示当前设备上的本地状态(这意味着只有您在测试设备上下载的文件),而不是使用的 ubiquity 容器 URL 显示所有可用的文件,无论您是否已在当前设备上下载它们。

于 2012-10-03T11:03:34.603 回答