web-dev-qa-db-ja.com

Swift 3.0でSDWebImageを使用して完了ブロックを使用するには?

画像のダウンロードに 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?'に変換できません

10
Parvezkhan

最終的に解決しました。

cell.appIcon.sd_setImage(with: url!, placeholderImage: UIImage(named: "App-Default"),options: SDWebImageOptions(rawValue: 0), completed: { (image, error, cacheType, imageURL) in
 // Perform operation.
}) 
16
Parvezkhan

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
        }
)
11
korgx9

使用しているフレームワークの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. 
})
3
jjatie

これはSwift 3でも動作します:

cell.appIcon.sd_setImage(with: url, placeholderImage: UIImage(named: "App-Default"), options: []) { (image, error, imageCacheType, imageUrl) in
            // Perform your operations here.
}
2

更新: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
}) 

これを試して、これがうまくいくことを願って

1
Muhammad Raza