画像のダウンロードに SDWebImage を使用しています。画像のダウンロードに成功したらさらに操作したい。
cell.appIcon.sd_setImage(with: url, placeholderImage: UIImage.init(named: "App-Default"), completed: {(image: UIImage!, error: NSError!, cacheType: SDImageCacheType, imageURL: URL!) -> Void in
// Perform operation.
})
しかし、エラーが発生しています:
タイプ '(UIImage !, NSError !, SDImageCacheType、URL!)-> Void'の値を予期される引数タイプ 'SDExternalCompletionBlock?'に変換できません
最終的に解決しました。
cell.appIcon.sd_setImage(with: url!, placeholderImage: UIImage(named: "App-Default"),options: SDWebImageOptions(rawValue: 0), completed: { (image, error, cacheType, imageURL) in
// Perform operation.
})
Swift 4バージョン
cell.appIcon.sd_setImage(with: url, placeholderImage: UIImage(named: "App-Default"),options: SDWebImageOptions(rawValue: 0), completed: { image, error, cacheType, imageURL in
// your rest code
})
重要!必要に応じて、保持サイクルを回避するために、自己を弱いまたは所有されていないもの(この[自己弱い]/[自己所有されていない]など)としてブロックに送信することを忘れないでください。
例:
cell.appIcon.sd_setImage(
with: url,
placeholderImage: UIImage(named: "App-Default"),
options: SDWebImageOptions(rawValue: 0),
completed: { [self weak] image, error, cacheType, imageURL in
guard let selfNotNil = self else { return }
// your rest code
}
)
使用しているフレームワークのtypedef
によれば、
typedef void(^SDExternalCompletionBlock)(UIImage * _Nullable image, NSError * _Nullable error, SDImageCacheType cacheType, NSURL * _Nullable imageURL);
SDExternalCompletionBlock
は、_Nullable
で示されるオプションのパラメーターで構成されます。そのため、コードは次のように記述する必要があります。
cell.appIcon.sd_setImage(with: url, placeholderImage: UIImage.init(named: "App-Default"), completed: {(image: UIImage?, error: NSError?, cacheType: SDImageCacheType, imageURL: URL?) -> Void in
// Perform operation.
})
コンパイラーは(関数宣言から)完了ブロックのパラメーターのタイプを知っているので、次のようにコードをより簡潔に、そして(IMO)読みやすくすることができます。
cell.appIcon.sd_setImage(with: url, placeholderImage: UIImage(named: "App-Default"), completed: { (image, error, cacheType, imageURL) in
// Perform operation.
})
これはSwift 3でも動作します:
cell.appIcon.sd_setImage(with: url, placeholderImage: UIImage(named: "App-Default"), options: []) { (image, error, imageCacheType, imageUrl) in
// Perform your operations here.
}
更新:Swift 5 SDWebImage 5.x.x
cell.imageView.sd_imageIndicator = SDWebImageActivityIndicator.gray
cell.imageView.sd_setImage(with: url) { (image, error, cache, urls) in
if (error != nil) {
// Failed to load image
cell.imageView.image = UIImage(named: "ico_placeholder")
} else {
// Successful in loading image
cell.imageView.image = image
}
}
================================================== ======================
cell.appIcon.sd_setImage(with: url, placeholderImage: UIImage(named: "App-Default"),options: SDWebImageOptions(rawValue: 0), completed: { (img, err, cacheType, imgURL) in
// code
})
これを試して、これがうまくいくことを願って