【问题标题】:How to clear Cache in iOS?如何在 iOS 中清除缓存?
【发布时间】:2019-09-29 06:55:15
【问题描述】:

TLDR如何根据我当前的 cacheManager 清除缓存?我应该使用什么代码以及如何使用?

我有用于缓存用户创建的视频的波纹管 cacheManager 类。 More info on how I use it is here

 public enum Result<T> {
    case success(T)
    case failure(NSError)
}

class CacheManager {

    static let shared = CacheManager()
    private let fileManager = FileManager.default
    private lazy var mainDirectoryUrl: URL = {

        let documentsUrl = self.fileManager.urls(for: .cachesDirectory, in: .userDomainMask).first!
        return documentsUrl
    }()

    func getFileWith(stringUrl: String, completionHandler: @escaping (Result<URL>) -> Void ) {

        let file = directoryFor(stringUrl: stringUrl)

        //return file path if already exists in cache directory
        guard !fileManager.fileExists(atPath: file.path)  else {
            completionHandler(Result.success(file))
            return
        }

        DispatchQueue.global().async {

            if let videoData = NSData(contentsOf: URL(string: stringUrl)!) {
                videoData.write(to: file, atomically: true)
                DispatchQueue.main.async {
                    completionHandler(Result.success(file))
                }
            } else {
                DispatchQueue.main.async {
                    let error = NSError(domain: "SomeErrorDomain", code: -2001 /* some error code */, userInfo: ["description": "Can't download video"])

                    completionHandler(Result.failure(error))
                }
            }
        }
    }

    private func directoryFor(stringUrl: String) -> URL {

        let fileURL = URL(string: stringUrl)!.lastPathComponent
        let file = self.mainDirectoryUrl.appendingPathComponent(fileURL)
        return file
    }

    public func clearCache() {
        //Delete Cookies
        if let cookies = HTTPCookieStorage.shared.cookies {
            for cookie in cookies {
                NSLog("\(cookie)")
            }
        }

        let storage = HTTPCookieStorage.shared
        for cookie in storage.cookies! {
            storage.deleteCookie(cookie)
        }
    }

}

我最近遇到了一个问题which I asked about here

为了解决这个问题,我认为我需要清除缓存。问题是我不知道该怎么做。

我尝试了什么:

    public func clearCache() {
    //Delete Cookies
    if let cookies = HTTPCookieStorage.shared.cookies {
        for cookie in cookies {
            NSLog("\(cookie)")
        }
    }

    let storage = HTTPCookieStorage.shared
    for cookie in storage.cookies! {
        storage.deleteCookie(cookie)
    }
}

一旦出现第一个获取内容的实例,就会像这样使用。

        CacheManager.clearCache()//Instance member 'clearCache' cannot be used on type 'CacheManager'; did you mean to use a value of this type instead?
        self.getFollowers()

关于我如何使用缓存管理器的一些信息:

  • 对于获取的每个媒体,我使用缓存管理器来存储视频 url(我假设是缓存的 videoURL)以供需要时使用

【问题讨论】:

    标签: ios swift caching cachemanager


    【解决方案1】:

    要清除缓存目录内容,您可以使用它的 url 调用此方法

    func clearContents(_ url:URL) { 
    
        do {
    
            let contents = try FileManager.default.contentsOfDirectory(atPath: url.path)
    
            print("before  \(contents)")
    
            let urls = contents.map { URL(string:"\(url.appendingPathComponent("\($0)"))")! }
    
            urls.forEach {  try? FileManager.default.removeItem(at: $0) } 
    
            let con = try FileManager.default.contentsOfDirectory(atPath: url.path)
    
            print("after \(con)")
    
        } 
        catch {
    
            print(error)
    
        }
    
     }
    

    调用你的方法

    CacheManager.shared.clearCache()
    

    但请注意,它的代码是无关紧要的,因为它有一个与网络相关的代码,并且您的内容存储在缓存目录中

    【讨论】:

    • 所以它起作用了:我这样称呼它: CacheManager.shared.clearCache() self.getFollowers() 在我获取所有数据的 viewDidLoad 中。那是一个取货的好地方吗?其次,现在我实现了这个视频需要更长的时间来加载是因为它们现在必须重新缓存,而在它们已经缓存之前,因此加载速度更快?
    • in viewDidLoad 是的,这是个好地方,确保清除缓存会使加载变慢,因为它会再次获取所有内容
    猜你喜欢
    • 2016-12-25
    • 2015-05-26
    • 2020-02-08
    • 2015-04-13
    • 2020-08-22
    • 1970-01-01
    • 2016-02-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多