2012-11-30 46 views
4

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

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

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

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

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

回答

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但没有副作用。您可以在每个请求中更改时间(或任何其他参数)。

+0

我只是想你的第二个解决方案和套结时间戳到URL不幸的是不起作用。 –

0

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

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

+0

我确实尝试过,但它不适用于每个iOS版本。在我的应用程序中,我每次都重新创建预览控制器,但缓存未被清除。 – Gabriel

0

这是iOS中最丑陋的错误。 iOS 5及更高版本中的缓存管理。我认为这也是导致iCloud越野车崩溃等原因的原因。糟糕的缓存管理以及最糟糕的同步系统。

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

1

你应该下载完整

0

只需删除tmp目录下的所有文件这样以后使用refreshCurrentPreviewItem:

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