web-dev-qa-db-ja.com

NSURLSessionTaskからキャッシュを無効にする方法

IOSアプリでは、NSURLSessionTaskを使用してjsonデータをアプリにダウンロードしています。ブラウザーからURLを直接呼び出すと、最新のjsonが取得され、アプリ内から呼び出されると、jsonの古いバージョンが取得されることがわかりました。

これはキャッシングによるものですか? NSURLSessionTaskにキャッシングを使用しないように指示するにはどうすればよいですか。

これは私が使用する呼び出しです:

NSURLSessionTask *task = [[NSURLSession sharedSession] dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {

ありがとう!

40
Van Du Tran

@runmadからリンクを読むと、フローチャートで、HEADのファイルが変更されていない場合、cachePolicyを設定するときにキャッシュバージョンが引き続き使用されることがわかります。

Swift3では、これを機能させるためにこれを行わなければなりませんでした:

let config = URLSessionConfiguration.default
config.requestCachePolicy = .reloadIgnoringLocalCacheData
config.urlCache = nil

let session = URLSession.init(configuration: config)

これにより、帯域幅の推定計算に必要な、キャッシュされていないバージョンのファイルが取得されました。

47
Dave Haupert

sharedSessionを使用する代わりに、デフォルトのキャッシュポリシーを指定するNSURLSessionを使用して独自のNSURLSessionConfigurationを作成することもできます。したがって、セッションのプロパティを定義します。

@property (nonatomic, strong) NSURLSession *session;

その後:

NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
configuration.requestCachePolicy = NSURLRequestReloadIgnoringLocalCacheData;
self.session = [NSURLSession sessionWithConfiguration:configuration];

そのセッションを使用するリクエストは、そのrequestCachePolicyを使用します。

36
Rob

Swift 3、Xcode 8

extension UIImageView {
func donloadImage(fromUrl url: URL) {
    let request = URLRequest(url: url, cachePolicy: URLRequest.CachePolicy.reloadIgnoringLocalCacheData, timeoutInterval: 60.0)
    URLSession.shared.dataTask(with: request) { (data, response, error) in
        guard
            let httpURLResponse = response as? HTTPURLResponse, httpURLResponse.statusCode == 200,
            let mimeType = response?.mimeType, mimeType.hasPrefix("image"),
            let data = data, error == nil,
            let image = UIImage(data: data)
            else { return }
        DispatchQueue.main.async() { () -> Void in
            self.image = image
        }
    }.resume()
}
7
Gurjit Singh

以下のコードは私のために働いた、キャッチはURLCacheをnilに設定しています。

 NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
    config.requestCachePolicy = NSURLRequestReloadIgnoringLocalCacheData;
    config.URLCache = nil;
4
anoop4real

Swift 4.2

私はそれがしばらく前であることを知っていますが、将来それが誰かを助けるかもしれない場合に備えて。

URLSession.ephemeral構成プロパティを使用することもできます。これは、デフォルトではCookieとキャッシュを保存しません。

ドキュメントが行くように、

一時セッション構成オブジェクトは、対応するセッションオブジェクトキャッシュ、資格情報ストア、またはセッション関連データをディスクに保存しないを除いて、デフォルトのセッション構成に似ています。代わりに、セッション関連のデータはRAMに保存されます。

したがって、コードは次のようになります。

let configuration = URLSessionConfiguration.ephemeral
let session = URLSession(configuration: configuration)
3
joliejuly

cachePolicyNSURLRequestを設定する必要があります。これは ドキュメント です。

キャッシングがどのように機能するかについての洞察はここにあります 一般に。

特にcachePolicyhere を指定するために使用できる特定の列挙型について読むことができます。

enum
{
   NSURLRequestUseProtocolCachePolicy = 0,
   NSURLRequestReloadIgnoringLocalCacheData = 1,
   NSURLRequestReturnCacheDataElseLoad = 2,
   NSURLRequestReturnCacheDataDontLoad = 3,
};
typedef NSUInteger NSURLRequestCachePolicy;

たとえば、次のようにします。

NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:60.0];
0
runmad

私は同じURLのキャッシュ画像を取得していました..これをしました

imageView.imageFromUrl(self.shareData.userResponseData["photo"] as! String)

extension UIImageView {

public func imageFromUrl(urlString: String) {

    if let url = NSURL(string: urlString) {

        let request = NSURLRequest(URL: url, cachePolicy: NSURLRequestCachePolicy.ReloadIgnoringLocalCacheData, timeoutInterval: 60.0)

        NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue()) {

            (response: NSURLResponse!, data: NSData!, error: NSError!) -> Void in
            self.image = UIImage(data: data)

        }
    }
}

}

0
Vinod Joshi