Как очистить кэш в iOS? - PullRequest
0 голосов
/ 11 мая 2019

TLDR : Как очистить кэш на основе моего текущего cacheManager? Какой код я должен использовать и как?

У меня есть нижеприведенный класс cacheManager, который я использую для кэширования видео, созданных пользователем. Больше информации о том, как я использую это здесь .

 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)
        }
    }

}

Недавно я столкнулся с проблемой , о которой я спрашивал здесь .

Чтобы исправить проблему, я считаю, что мне нужно очистить кеш. Проблема в том, что я не знаю, как это сделать.

Что я пробовал:

    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) для использования при необходимости

1 Ответ

1 голос
/ 11 мая 2019

Чтобы очистить содержимое каталога кеша, вы можете вызвать этот метод с помощью его 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()

Но учтите, что этот код неактуален, так как он имеет сетевую работусвязанный код, и ваш контент хранится в каталоге кеша

...