失效QLPreviewController的“缓存”

4

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

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

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

我目前使用的解决方法是,在预览文件时将其移动到唯一文件名(使用时间戳),这当然不会在QLPreviewController的缓存中。但是,这还有其他影响,例如,如果应用程序被杀死或崩溃(天啊),我将不知道“在哪里”找到下载的文件。

我正在寻找不太侵入性的黑客,或者解决方案来使QLPreviewController刷新其缓存。这些API似乎没有公开任何东西,因此如果您提出的黑客比我上面呈现的要少,则不要害怕提交(不包括将文件复制/移动到保证唯一的URL,我已经在利用)。

5个回答

1

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

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


我确实尝试了相同的方法,但它并不适用于每个iOS版本。在我的应用中,我每次都会重新创建预览控制器,但缓存没有被清除。 - Gabriel

1

下载完成后应使用refreshCurrentPreviewItem


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];
}

在我脑海中浮现出另一种解决方案(未经测试)。

根据您的URL,您可以像这样添加一些内容 http://url?time=123456 到您的URL上。这样您就可以改变URL但不会产生任何副作用。时间(或任何其他参数)您可以在每个请求中更改。


我刚刚尝试了你的第二个解决方案,将时间戳附加到URL上不起作用。 - Frank Schmitt

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];
    }
}

0

这是iOS中最丑陋的bug。iOS 5及以上版本中的缓存管理。我认为这也是导致iCloud出现故障、Share-at-Home崩溃等问题的原因。糟糕的缓存管理和同步系统。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接