9

以下のコードを拡張して、画像をキャッシュし、以前にキャッシュされていない場合にのみダウンロードしたいと思います。これを行うために URLSession オブジェクトを使用する方法の良い例が見つからないようです。

extension UIImageView {
    func loadImageWithURL(_ url: URL) -> URLSessionDownloadTask {
        let session = URLSession.shared

        let downloadTask = session.downloadTask(with: url, completionHandler: { [weak self] url, response, error in

            if error == nil, let url = url,
                let data = try? Data(contentsOf: url), let image = UIImage(data: data) {

                    DispatchQueue.main.async {
                        if let strongSelf = self {
                            strongSelf.image = image
                        }
                    }
            }
        })
        downloadTask.resume()
        return downloadTask
    }
}
4

4 に答える 4

1

URLSession DataTask はデフォルトで画像を自動的にキャッシュします。サーバーのキャッシュ設定が正常である限り、クライアント側で何もする必要はありません。画像は静的なアセットであり、短時間で変更されることはありません。その結果、サーバーは通常「Cache-Control」を「public, max-age:xxxxx」に設定します。URLSession のデフォルトのキャッシュ ポリシーは、画像をメモリとディスクの両方にキャッシュします。ただし、URLCache に割り当てられたディスク サイズの 5% を超えるサイズの画像はキャッシュされず、バックグラウンド スレッドでもキャッシュされません。

于 2021-07-18T19:14:44.157 に答える