2017-07-28 13 views
0

AlamofireImages ImageDownloaderを動作させるのに少し問題があります。以下は、私がダウンロードして後で画像をキャッシュするために使用しようとしている関数です。応答がないか、完了ブロックがスキップされました。AlamofireImage

以前は画像をリクエストするのに通常のAlamofireを使用しましたが、プロジェクトはサーバーへの要求量を減らすためにイメージをディスクにキャッシュすることを含むように進化しました。 AlamofireImageドキュメントhereを通じて探し

var downloader: ImageDownloader? 

func downloadAndCacheImage(_ url: String, imageView: UIImageView) 
{ 
    self.downloader = ImageDownloader() 

    var urlRequest = try! URLRequest(url: "GiveMeAResponse.com", method: .get) 

    self.downloader?.download(urlRequest) { response in 

     switch response.result{ 
     case .success(let image): 
      print("\(image) has been downloaded") 
      break 
     case .failure(let error): 
      print("ERROR: \(response.error)") 
      break 
     } 

     if let imageData = response.data{ 
      debugPrint("Applying image...") 
      if let image = UIImage(data: imageData){ 
       ImageManager.applyImage(imageView: imageView, image: image) 
      } 
     } 
    } 
} 

、それはダウンロード要求を送信するために非常に単純に見えると私は、私は、少なくとも失敗メッセージを取得する必要があります持っているものであるかのように感じます。コンプリートブロックはすべて一緒にスキップされています。なぜなら、それがドキュメントにも含まれていない限り、私は完全にはわかりません。

ImageDownloaderインスタンスを強く参照してください。そうしないと、クロージャが呼び出される前にダウンローダの参照が範囲外になるため、完了クロージャは呼び出されません。

これはちょっと疑問に思うかもしれませんが、私は上記のことをしていないので、クロージャが呼び出されませんでしたか?

誰かがいくつかの洞察力を持っているなら、それはすばらしいでしょう。

編集:ImageDownloaderへの強い参照が含まれています。

編集#2:ダウンロードに変数を割り当てて応答コードを出力すると、nilが返されます。 (たぶん、リクエストが別のスレッドで実行されるため?)

var downloader: ImageDownloader? 

func downloadAndCacheImage(_ url: String, imageView: UIImageView) 
{ 
    self.downloader = ImageDownloader() 

    var urlRequest = try! URLRequest(url: URL(string: "https://solarianprogrammer.com/images/2013/02/28/mandelbrot_piece_Z2.png")!) 

    let downloadReciept = self.downloader?.download([urlRequest]) 
    print(downloadReciept?[0].request.response) // Returns nil 

} 

編集#3: 私は最終的にそれを固定し、私のコードは次のようになります。

let downloader = ImageDownloader.default 
func downloadAndCacheImage(_ url: String, imageView: UIImageView) 
{ 
    var urlRequest = try! URLRequest(url: URL(string: "https://solarianprogrammer.com/images/2013/02/28/mandelbrot_piece_Z2.png")!) 

    self.downloader.download(urlRequest) { response in 
     switch response.result{ 
     case .success(let image): 
      print("\(image) has been downloaded") 
      break 
     case .failure(let error): 
      print("ERROR: \(response.error)") 
      break 
     } 

     if let imageData = response.data{ 
      debugPrint("Applying image...") 
      if let image = UIImage(data: imageData){ 
       ImageManager.applyImage(imageView: imageView, image: image) 
      } 
     } 
    } 
} 

私は本当に変わっすべてでした。

let downloader = ImageDownloader() 

へ:

let downloader = ImageDownloader.default 

私は本当にこれがこの問題に遭遇する人に役立つことを願っています!

答えて

0

自分のコードを以下に変更して問題を解決することができました。何らかの理由で、以下の行がそれを修正しました。

LETダウンローダ= ImageDownloader()

にLETダウンローダ= ImageDownloader。デフォルト

let downloader = ImageDownloader.default 
func downloadAndCacheImage(_ url: String, imageView: UIImageView) 
{ 
    var urlRequest = try! URLRequest(url: URL(string: "https://solarianprogrammer.com/images/2013/02/28/mandelbrot_piece_Z2.png")!) 

    self.downloader.download(urlRequest) { response in 
     switch response.result{ 
     case .success(let image): 
      print("\(image) has been downloaded") 
      break 
     case .failure(let error): 
      print("ERROR: \(response.error)") 
      break 
     } 

     if let imageData = response.data{ 
      debugPrint("Applying image...") 
      if let image = UIImage(data: imageData){ 
       ImageManager.applyImage(imageView: imageView, image: image) 
      } 
     } 
    } 
} 

これは誰もが遭遇するのに役立ちます。

1

は次のものが必要です。

class MyClass 
{ 
    var downloader: ImageDownloader? // This acts as the 'strong reference'. 

    ... 

    func downloadAndCacheImage(_ url: String, imageView: UIImageView) 
    { 
     self.downloader = ImageDownloader() 

     ... 
    } 
} 

ダウンロードはあなたのdownloadAndCacheImage()戻り(他のスレッド(複数可)を使用して)後に発生するので。

現在のdownloaderdownloadAndCacheImage()のローカル/自動変数です。 downloadAndCacheImage()が終了すると解放されます。これは、ダウンロードプロセスを途中で中止します。

+0

お返事ありがとうございます!私はこれを試してみましたが、実際には初期化するのを忘れてしまったので、今回はうまくいくと思っていました。しかし何らかの理由で、クロージャーはまだスキップされています。 :/ 私の変更を自分のコードに反映するために質問を編集します。 – Mystified

+1

あなたのURLが正しいかどうかをチェックし、GETに応答します(たとえば 'curl 'を使用して)?ダウンローダにエラーブロックまたはエラー機能を呼び出すデリゲートがありませんか? –

+0

GETメソッドを使用する他の関数を使ってテストしたので、私のURLは正しいです。あなたの質問の2番目の部分については、Alamofireと同じように機能し、画像を取得できなかった場合はエラーを出力することを期待していました。 私は、Alamofireだけでうまくいくことを確かめるためにコードを変更しましたが、実際にはうまくいきました。それは私が問題を抱えているImageDownloaderです。だから、エラー関数を呼び出すデリゲートはありません。 – Mystified

関連する問題