【问题标题】:Invalidating QLPreviewController "cache"使 QLPreviewController “缓存”无效
【发布时间】:2012-11-30 16:53:53
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: ios uikit qlpreviewcontroller


    【解决方案1】:

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

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

    【讨论】:

    • 我确实尝试过,但它不适用于每个 iOS 版本。在我的应用程序中,我每次都会重新创建预览控制器,但没有清除缓存。
    【解决方案2】:

    下载完成后应使用 refreshCurrentPreviewItem

    【讨论】:

      【解决方案3】:

      我遇到了同样的问题。打开本地生成的 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 但没有副作用。您可以在每个请求上更改的时间(或任何其他参数)。

      【讨论】:

      • 我刚刚尝试了您的第二个解决方案,不幸的是,在 URL 上添加时间戳不起作用。
      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

        只需像这样从 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];
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2021-09-19
          • 1970-01-01
          • 2017-01-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-12-26
          相关资源
          最近更新 更多