2014-06-20 7 views
27

से कैशिंग को अक्षम करने के लिए कैसे करें मेरे आईओएस ऐप में, मैं अपने ऐप में जेसन डेटा डाउनलोड करने के लिए NSURLSessionTask का उपयोग कर रहा हूं। मैंने पाया कि जब मैं ब्राउज़र से यूआरएल को सीधे कॉल करता हूं, तो मुझे एक अद्यतित जेसन मिल जाता है और जब इसे ऐप के अंदर से बुलाया जाता है, तो मुझे जेसन का पुराना संस्करण मिलता है।NSURLSessionTask

क्या यह कैशिंग के कारण है? कैशिंग का उपयोग न करने के लिए मैं NSURLSessionTask कैसे बता सकता हूं।

इस कॉल मैं का उपयोग करें:

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

धन्यवाद!

+1

यदि आपके पास एपीआई सर्वर है, तो आप उस अंत में कैशिंग हेडर को ठीक करने पर विचार करना चाहेंगे। URLSessionTasks हेडर का पालन करना चाहिए, इसलिए शायद कुछ सही सेट नहीं किया जा रहा है। –

उत्तर

21

यदि आपका से आप प्रवाह चार्ट में देख सकते हैं @runmad कि अगर फ़ाइल के प्रमुख अपरिवर्तित है यह अभी भी प्रयोग किया जाएगा लिंक पढ़ कैश संस्करण जब आप कैश पॉलिसी सेट करते हैं।

Swift3 में मैं यह करने के लिए यह काम करने के लिए पाने के लिए था:

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

let session = URLSession.init(configuration: config) 

उस फ़ाइल की एक सही मायने में गैर कैश्ड संस्करण है, जो मैं बैंडविड्थ आकलन गणना के लिए आवश्यक हो गया।

+0

यह अजीब बात है, मैंने सोचा होगा कि urlCache डिफ़ॉल्ट रूप से शून्य है। –

+0

5 घंटे से इस के आसपास अपना सिर मार रहा है, बचाया गया –

+0

@VanDuTran [URLCache दस्तावेज़] से [https://developer.apple.com/documentation/foundation/urlsessionconfiguration/1410148-urlcache): "डिफ़ॉल्ट सत्रों के लिए, डिफ़ॉल्ट मान साझा यूआरएल कैश ऑब्जेक्ट है। " मतलब अगर आप कुछ भी निर्दिष्ट नहीं करते हैं तो यह केवल उसी कैश का उपयोग करेगा जो * साझा * सत्र – Honey

0

आपको cachePolicyNSURLRequest पर सेट करने की आवश्यकता है, यहां documentation है।

Here's some insight as to how caching works सामान्य रूप से।

आप विशिष्ट enums आप विशेष रूप से cachePolicyhere निर्दिष्ट करने के लिए उपयोग कर सकते हैं के बारे में पढ़ सकते हैं:

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

उदाहरण के लिए, आप क्या करेंगे:

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

मैं NSURLSession का उपयोग कर रहा हूं। –

32

बल्कि sharedSession का उपयोग करने से, आप NSURLSessionConfiguration का उपयोग करके अपना खुद का NSURLSession भी बना सकता है जो डिफ़ॉल्ट कैश नीति निर्दिष्ट करता है। तो, अपने सत्र के लिए एक संपत्ति को परिभाषित:

@property (nonatomic, strong) NSURLSession *session; 

और फिर:

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

फिर उस सत्र का उपयोग कि requestCachePolicy का उपयोग करेगा अनुरोध करता है।

+0

यह मेरे लिए काम नहीं करता प्रतीत होता है।कम से कम आईओएस सिम्युलेटर में नहीं। इंटरनेट कनेक्शन बंद करने का प्रयास किया, लेकिन फिर यह एक कैश जवाब देता है। कृपया mu प्रश्न पर एक नज़र डालें http://stackoverflow.com/questions/30324394/prevent-nsurlsession-from-caching-responses – Sunkas

+2

मुझे लगता है कि हमें 'nil' – onmyway133

+0

पर 'URLCache' सेट करने की भी आवश्यकता है, क्या हम ** ** जो आपने लिखा है या केवल कैश को 'शून्य' पर सेट करें? या हमें * NSURLRequestReloadIgnoringLocalCacheData' शामिल करना होगा? इसके अलावा एक क्षणिक सत्र का उपयोग क्यों न करें? – Honey

0

मैं एक ही यूआरएल के लिए कैश छवि हो रही थी .. इसलिए मैं इस

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) 

     } 
    } 
} 

}

3

नीचे कोड मेरे लिए काम किया किया है, पकड़ नहीं के बराबर करने के लिए Urlcache स्थापित कर रही है।

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

स्विफ्ट 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() 
} 
संबंधित मुद्दे