2016-10-27 10 views
6

मैं एक यूआरएल से छवियों को डाउनलोड करने के लिए AlamofireImage का उपयोग करना चाहता हूं और फिर इसे डिवाइस डिस्क स्थान पर कैश करना चाहता हूं। मैंने इसके बारे में कई पोस्ट पढ़ी और पाया कि अलामोफायर इमेज ImageDownloader कक्षा की सहायता से इसका समर्थन करता है। सबसे दिलचस्प जानकारी in this SO answerAlamofireImage डिस्क कैश काम नहीं कर रहा

इसलिए मैंने ImageDownloader के लिए कस्टम NSURLCache सेट करने का प्रयास किया ताकि यह छवियों को सीधे डिस्क पर कैश कर सके। मैंने स्मृति क्षमता को 0 पर सेट करके किया था। फिर मैं एक छवि डाउनलोड करने के लिए इस कस्टम ImageDownloader का उपयोग करता हूं। डिस्क पथ के लिए निर्दिष्ट फ़ोल्डर डिस्क पर बनाया गया है लेकिन दुर्भाग्यवश यह खाली रहता है और छवि किसी भी तरह से कैश नहीं होती है।

** संपादित करें: ** यह ध्यान रखना महत्वपूर्ण है कि कैश निर्देशिका में फ़ोल्डर में कैश किए गए प्रतिसाद सहेजे नहीं जाते हैं बल्कि फ़ोल्डर के बगल में डेटाबेस फ़ाइल में सहेजे जाते हैं।

क्या कोई मुझे बता सकता है कि मैं यहां क्या कर रहा हूं? पढ़ने के लिए बहुत बहुत धन्यवाद!

func diskImageDownloader(diskSpaceMB: Int = 100) -> ImageDownloader { 

    let diskCapacity = diskSpaceMB * 1024 * 1024 
    let diskCache = NSURLCache(memoryCapacity: 0, diskCapacity: diskCapacity, diskPath: "alamofireimage_disk_cache") 
    let configuration = NSURLSessionConfiguration.defaultSessionConfiguration() 
    configuration.URLCache = diskCache 
    let downloader = ImageDownloader(configuration: configuration) 
    UIImageView.af_sharedImageDownloader = downloader 

    return downloader 
} 

func getProfileImage(atURL url: String, onComplete: SRServiceResponse<UIImage> -> Void) { 
    guard let imageURL = NSURL(string: url) else 
    { 
     // TODO: Fail here 
     return 
    } 

    let request = NSURLRequest(URL: imageURL) 

    let imageDownloader = self.diskImageDownloader() 

    imageDownloader.downloadImage(URLRequest: request) { (response) in 
     switch response.result 
     { 
     case .Success(let image): 
      // Do something 
     case .Failure(let error): 
      // Do something 
     } 
    } 
} 

उत्तर

4

तक पहुँचने के लिए अपने लक्ष्य को बनाने के अपने NSURLCache जो आप संग्रहीत चित्रों के लिए स्वयं समाप्ति तिथि निर्धारित करने के लिए diskCache वास्तव में कस्टम के रूप में उपयोग: इसके बजाय एक नया ImageDownloader हर बार जब आप पुन: उपयोग कर सकता बनाने के

class DiskCache: NSURLCache { 
    private let constSecondsToKeepOnDisk = 30*24*60*60 // 30 days 

    override func storeCachedResponse(cachedResponse: NSCachedURLResponse, forRequest request: NSURLRequest) { 
     var customCachedResponse = cachedResponse 
     // Set custom Cache-Control for Image-Response 
     if let response = cachedResponse.response as? NSHTTPURLResponse, 
      let contentType = response.allHeaderFields["Content-Type"] as? String, 
      var newHeaders = response.allHeaderFields as? [String: String] where contentType.containsString("image") { 
      newHeaders["Cache-Control"] = "public, max-age=\(constSecondsToKeepOnDisk)" 
      if let url = response.URL, newResponse = NSHTTPURLResponse(URL: url, statusCode: response.statusCode, HTTPVersion: "HTTP/1.1", headerFields: newHeaders) { 
       customCachedResponse = NSCachedURLResponse(response: newResponse, data: cachedResponse.data, userInfo: cachedResponse.userInfo, storagePolicy: cachedResponse.storagePolicy) 
      } 
     } 
     super.storeCachedResponse(customCachedResponse, forRequest: request) 
    } 
} 

downloadImage विधि को कॉल करने के लिए साझा उदाहरण: UIImageView.af_sharedImageDownloader.downloadImage(URLRequest: request)

+1

अपने जवाब के लिए धन्यवाद। असल में मेरी छवि प्रतिक्रिया में अधिकतम आयु वाला हेडर गायब था। यह भी ध्यान रखना महत्वपूर्ण है कि कैश किए गए प्रतिसाद कैश निर्देशिका में फ़ोल्डर में सहेजे नहीं जाते हैं बल्कि फ़ोल्डर के बगल में डेटाबेस फ़ाइल में सहेजे जाते हैं। –

4

मैं प्रतिनिधि के लिए ऐसा नहीं कर रहा हूं। बस आपको कंपाइलर के साथ समय बचाने के लिए।

स्विफ्ट में 3,0

class DiskCache: URLCache { 


    private let constSecondsToKeepOnDisk = numDaysToKeep*24*60*60 // numDaysToKeep is your own constant or hard-coded value 

    override func storeCachedResponse(_ cachedResponse: CachedURLResponse, for request: URLRequest) { 

    var customCachedResponse = cachedResponse 
    // Set custom Cache-Control for Image-Response 
    let response = cachedResponse.response as! HTTPURLResponse 

    if let contentType = response.allHeaderFields["Content-Type"] as? String, 
     var newHeaders = response.allHeaderFields as? [String: String], contentType.contains("image") { 
     newHeaders["Cache-Control"] = "public, max-age=\(constSecondsToKeepOnDisk)" 
     if let url = response.url, let newResponse = HTTPURLResponse(url: url, statusCode: response.statusCode, httpVersion: "HTTP/1.1", headerFields: newHeaders) { 
      customCachedResponse = CachedURLResponse(response: newResponse, data: cachedResponse.data, userInfo: cachedResponse.userInfo, storagePolicy: cachedResponse.storagePolicy) 
     } 
    } 
    super.storeCachedResponse(customCachedResponse, for: request) 
    } 
} 
+0

किसी छवि को UIImageView पर सेट करने के लिए मैं इसका उपयोग कैसे कर सकता हूं? – markhorrocks

+0

umm ... AlamofireImage के लिए निर्देशों का उपयोग करें ?? : डी – horseshoe7

+0

हाँ ने कोशिश की, इसे समझ में नहीं आया। माफ़ कीजिये। – markhorrocks

संबंधित मुद्दे