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
私は本当にこれがこの問題に遭遇する人に役立つことを願っています!
お返事ありがとうございます!私はこれを試してみましたが、実際には初期化するのを忘れてしまったので、今回はうまくいくと思っていました。しかし何らかの理由で、クロージャーはまだスキップされています。 :/ 私の変更を自分のコードに反映するために質問を編集します。 – Mystified
あなたのURLが正しいかどうかをチェックし、GETに応答します(たとえば 'curl 'を使用して)?ダウンローダにエラーブロックまたはエラー機能を呼び出すデリゲートがありませんか? –
GETメソッドを使用する他の関数を使ってテストしたので、私のURLは正しいです。あなたの質問の2番目の部分については、Alamofireと同じように機能し、画像を取得できなかった場合はエラーを出力することを期待していました。 私は、Alamofireだけでうまくいくことを確かめるためにコードを変更しましたが、実際にはうまくいきました。それは私が問題を抱えているImageDownloaderです。だから、エラー関数を呼び出すデリゲートはありません。 – Mystified