在iOS中清除缓存目录的最佳做法是什么?

时间:2016-08-17 18:44:52

标签: ios objective-c swift

我使用NSURLRequestReturnCacheDataElseLoad缓存策略将网页加载到WKWebview。除非清除缓存,否则我无需清除缓存 服务器显然告诉我这样做。但是,一旦服务器告诉我这样做,我就很难清除缓存。

大多数答案和文章表明removeAllCachedResponses有效,尽管有几个投诉在传播 关于NSURLCache与NSURLSession或UIWebView无法正常工作。我无法在iOS 8.4或9.3模拟器中使用它。

所以我使用以下代码以编程方式清除缓存目录中的所有文件。我在WKWebview中使用的网站缓存文件 驻留在 Application / Cache / bundleidentifier 中。虽然,我尝试删除所有可用的文件。当我运行代码时,我在尝试删除/快照时出错 。现在这让我想知道缓存目录中有哪些其他文件我不应该篡改? 我知道SDWebImage缓存和其他一些文件驻留在这个目录中。但是,我还是需要清除SDWebImage缓存。

以下是我用来清除缓存目录的代码:

public func clearCache(){
    let cacheURL =  NSFileManager.defaultManager().URLsForDirectory(.CachesDirectory, inDomains: .UserDomainMask).first!
    let fileManager = NSFileManager.defaultManager()
    do {
        // Get the directory contents urls (including subfolders urls)
        let directoryContents = try NSFileManager.defaultManager().contentsOfDirectoryAtURL( cacheURL, includingPropertiesForKeys: nil, options: [])
        for file in directoryContents {
            do {
                  try fileManager.removeItemAtURL(file)
                }
                catch let error as NSError {
                    debugPrint("Ooops! Something went wrong: \(error)")
                }

            }
    } catch let error as NSError {
        print(error.localizedDescription)
    }
}

现在,这是一个很好的做法吗?我是否有任何明显的方法可以实现同样的目标?

2 个答案:

答案 0 :(得分:5)

你的代码很棒。我试图在WKWebsiteDataStore中使用removeDataOfTypes,但它没有用。

这是Swift 3中的@Ashildr解决方案:

func clearCache(){
    let cacheURL =  FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask).first!
    let fileManager = FileManager.default
    do {
        // Get the directory contents urls (including subfolders urls)
        let directoryContents = try FileManager.default.contentsOfDirectory( at: cacheURL, includingPropertiesForKeys: nil, options: [])
        for file in directoryContents {
            do {
                try fileManager.removeItem(at: file)
            }
            catch let error as NSError {
                debugPrint("Ooops! Something went wrong: \(error)")
            }

        }
    } catch let error as NSError {
        print(error.localizedDescription)
    }
}

答案 1 :(得分:2)

清除缓存目录完全没问题。是的,迭代内容是它的完成方式。

这就是Apple所说的:

  

使用此目录编写您的任何特定于应用程序的支持文件   应用程序可以轻松地重新创建。您的应用程序通常负责   管理此目录的内容以及添加和删除   文件根据需要。

File System Overview