4

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

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

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

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

我正在寻找侵入性较小的黑客,或使 QLPreviewController 刷新其缓存的解决方案。API 似乎没有暴露任何东西,所以如果它没有我上面介绍的那么严重,请不要害怕提交 hack(不包括将文件复制/移动到有保证的唯一 URL,我已经利用)。

4

5 回答 5

1

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

于 2013-06-28T06:32:00.213 回答
1

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

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

于 2013-03-15T15:02:01.437 回答
0

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

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

于 2013-04-08T08:06:56.580 回答
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,您可以在 URL 中添加类似http://url?time=123456的内容。像这样您更改 URL 但没有副作用。您可以在每个请求上更改的时间(或任何其他参数)。

于 2013-01-08T22:14:40.150 回答
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];
    }
}
于 2013-09-30T08:13:30.857 回答