2012-11-30 43 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]; 
    } 
}