使QLPreviewController“缓存”无效

时间:2012-11-30 16:53:54

标签: ios uikit qlpreviewcontroller

QLPreviewController似乎根据本地文件的URL缓存文件内容。在我的应用程序中,文件内容可以远程更新,并会导致下载新内容。

如果我在QLPreviewController中查看文件,远程更新它,然后重新预览,该文件不会显示为已更新。

文件肯定会在磁盘上更新,其他控件会显示正确的更新文件。

我现在使用的解决方法是基本上将文件预览为一个唯一的文件名(使用时间戳),这当然不会在QLPreviewController的缓存中。但是,这有其他影响,例如,如果应用程序被杀或崩溃(上帝禁止),我不知道“在哪里”找到下载的文件。

我正在寻找更少侵入性的黑客攻击,或者让QLPreviewController刷新其缓存的解决方案。 API似乎没有暴露任何东西,所以如果它不如我上面提到的那么粗糙,不要害怕提交黑客(不包括复制/移动文件到保证的唯一URL,我已经利用)。

5 个答案:

答案 0 :(得分:1)

我自己也遇到过这个问题。每次重新加载与当前查看项目同名的项目时,我都会通过重新创建QLPreviewController来解决它。创建一个新的QLPreviewController会清除缓存。

我知道这是一个老问题,但有人可能会遇到同样的问题,并且发现这个答案很有帮助。

答案 1 :(得分:1)

下载完成后,您应该使用refreshCurrentPreviewItem

答案 2 :(得分:0)

我遇到了同样的问题。打开本地生成的CSV文件。

我将_previewController *设置为我的控制器的@property。那我做了什么:

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.previewController = [[QLPreviewController alloc] init];
    _previewController.delegate=self;
    _previewController.dataSource=self;
}

- (void)previewCSV
{
    [_previewController reloadData]; // this triggers a reload
    [self presentModalViewController:_previewController animated:YES];
}

在我想到的其他解决方案中(测试)。

根据您的网址,您可以在网址中添加 http:// url?time = 123456 等内容。像这样你改变URL但没有副作用。您可以在每个请求上更改的时间(或任何其他参数)。

答案 3 :(得分:0)

这是iOS中最丑陋的错误。 iOS 5及更高版本中的缓存管理。我认为是使iCloud越野车,Share-at-Home崩溃等原因相同的原因。糟糕的缓存管理和最差的同步系统。

好吧,我的解决方案是将下载文件存储在一个文件夹中,并使用当前日期来命名该文件夹。它相当于@Rogier的解决方案,但这始终有效。您将获得该文件夹的名称,例如,使用[[NSDate date] description]。您可以删除以前的文件,删除以前的文件夹并将新文件保存到新文件夹中,而不是保存文件替换旧文件。它对我来说很好。

答案 4 :(得分:0)

只需删除tmp目录中的所有文件,如下所示:

- (void)clearCache
{
    NSString *tempPath = NSTemporaryDirectory();
    NSArray *dirContents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:tempPath error:nil];

    NSFileManager *fileManager = [NSFileManager defaultManager];

    for (int i = 0; i < [dirContents count]; i++) {
        NSLog(@"Directory Count: %i", [dirContents count]);
        NSString *contentsOnly = [NSString stringWithFormat:@"%@%@", tempPath, [dirContents objectAtIndex:i]];
        [fileManager removeItemAtPath:contentsOnly error:nil];
    }
}