QLPreviewController似乎根据本地文件的URL缓存文件内容。在我的应用程序中,文件内容可以远程更新,并会导致下载新内容。
如果我在QLPreviewController中查看文件,远程更新它,然后重新预览,该文件不会显示为已更新。
文件肯定会在磁盘上更新,其他控件会显示正确的更新文件。
我现在使用的解决方法是基本上将文件预览为一个唯一的文件名(使用时间戳),这当然不会在QLPreviewController的缓存中。但是,这有其他影响,例如,如果应用程序被杀或崩溃(上帝禁止),我不知道“在哪里”找到下载的文件。
我正在寻找更少侵入性的黑客攻击,或者让QLPreviewController刷新其缓存的解决方案。 API似乎没有暴露任何东西,所以如果它不如我上面提到的那么粗糙,不要害怕提交黑客(不包括复制/移动文件到保证的唯一URL,我已经利用)。
答案 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];
}
}