2017-08-11 21 views
0

AlamofireImagesで少し助けが必要です。だから、ディスクにAlamofireImageの応答をキャッシュする

func sendImageRequest(imageView: UIImageView, item: CatalogItem, isLargeImage: Bool? = false){ 
    let imageURL = ImageManager.URLBuilder(sku: item.sku, largeImage: isLargeImage) 

    // Clear the image so that recycled images are cleared. 
    imageView.image = nil 

    // Create the request and add the token string to the authorization header 
    var urlRequest = try! URLRequest(url: URL(string: imageURL)!) 
    urlRequest.setValue("Bearer \(ImageManager.getTokenString()!)", forHTTPHeaderField: "Authorization") 

    // If the token exists AND is VALID (not expired) - Get the image. 
    if ImageManager.checkIfTokenExists() && ImageManager.checkTokenIsValid(){ 
     debugPrint("Valid token already exists. Fetching image... TableViewExtension") 
     imageView.af_setImage(withURLRequest: urlRequest){ response in 
      switch response.result{ 
      case .success(let image): 
       debugPrint(response) 
       debugPrint("SUCCESS") 
       break 
      case .failure(let error): 
       debugPrint("Error: \(error)") 
       debugPrint(response.response) 
       break 
      } 
     } 
    } 
    // Else if the token exists AND is INVALID (expired) - Delete the old token, get a new one, and fetch the image 
    else if ImageManager.checkIfTokenExists() && !ImageManager.checkTokenIsValid(){ 
     debugPrint("Token expired... Getting new token.") 
     ImageManager.deleteToken() 
     let tokenRequest = NetRequest.newTokenRequest(url: "http://\(SettingsManager.KEY_ServerURL).ziizii.io/zz/jwt/new?service=images.ziizii.io") 
     tokenRequest.requestJWTToken(){ 
      debugPrint("Token renewed. Fetching image...") 
      imageView.af_setImage(withURLRequest: urlRequest) 
     } 
    } 
    // If the token doesn't exist, request a new one and fetch the image. 
    else{ 
     debugPrint("Requesting new token...") 
     let tokenRequest = NetRequest.newTokenRequest(url: "http://\(SettingsManager.KEY_ServerURL).ziizii.io/zz/jwt/new?service=images.ziizii.io") 
     tokenRequest.requestJWTToken(){ 
      debugPrint("Token aquired. Fetching image...") 
      imageView.af_setImage(withURLRequest: urlRequest) 
     } 
    } 
} 

、私はと大丈夫だよ、この部分:アプリでは、テーブルビューのセルをタップすると、以下の見ImageViewの拡張、中に組み込まれて使用してイメージをダウンロードして設定します。これは、オブジェクトをディスクにキャッシュし、ImageViewイメージを設定します。後でもう一度タップすると、画像がキャッシュに保存されているかどうかが確認され、保存されている場合は画像が適用されます。きちんとした

今、プロジェクトの新しい要件は、ユーザーにすべての画像をプリロードしてキャッシュする機能をユーザーに与えることです。今はAFI ImageView拡張機能を使用せず、代わりにDownloaderを使用しています。 A)ディスクへのキャッシュと B)ユーザーがセルをタップすると、ImageView拡張機能で同じキャッシュがチェックされ、プリロードされているかどうかが確認され、そのイメージが適用されます。

AFIは、要求を送信する前に画像データのキャッシュをチェックするほどスマートですので、これが可能であると確信しています。

私が画像をダウンロードするために、これまで持っていることは以下の通りです:

static var downloader = ImageDownloader.default 

static func downloadImage(urlRequest: URLRequestConvertible) 
{ 
    self.downloader.download(urlRequest) { response in 
     switch response.result{ 
     case .success(let image): // If successful, cache the image. 
      print("SUCCESS") 
      break 
     case .failure(let error): // If unsuccessful, remove the cached 404 response and apply a nil image. 
      print("ERROR: \(response.error)") 
      break 
     } 
    } 
} 

誰もが素晴らしいだろう、このまたは任意の役立つヒントやトリックを達成するためにどのように任意のアイデアを持っている場合は!ありがとう!

答えて

0

私はあなたがダウンロードURLとして文字列からイメージをダウンロードしていると仮定します。私は同じ問題に取り組んだ。私の場合、私はAlamofireを使用していないし、私は画像ビューに拡張を使用していた:

let imageCache = NSCache<AnyObject, AnyObject>() 

拡張UIImageView {

func downloadImage(from imgURL: String!) { 

    self.image = nil 

    // Check if there's an image in the cache 

    if let cachedImage = imageCache.object(forKey: imgURL as AnyObject) as? UIImage { 
     self.image = cachedImage 
     return 
    } 

    // Otherwise, download image from Firebase via URL-string 

    let url = URLRequest(url: URL(string: imgURL)!) 

    let task = URLSession.shared.dataTask(with: url) { 
     (data, response, error) in 

     if error != nil { 
      print(error!) 
      return 
     } 

     DispatchQueue.main.async { 
      if let image = UIImage(data: data!) { 
       imageCache.setObject(image, forKey: imgURL as AnyObject) 
      } 
      self.image = UIImage(data: data!) 
     } 

    } 

    task.resume() 
} 

}

今はによって予荷重の問題を解決しましたviewDidLoad()で単に

for i in objects { // whatever object you're having 

    imageView.downloadImage(fromURL: i.url) 

} 

...を呼び出します。

すべてのイメージをダウンロードしてキャッシュするすべてのカスタムオブジェクトをループします。ユーザーがイメージをタップすると、即座にキャッシュからロードされます。これがあなたの問題を助けてくれることを願っています。

関連する問題