web-dev-qa-db-fra.com

Comment utiliser le bloc d'achèvement à l'aide de SDWebImage dans Swift 3.0?

J'utilise SDWebImage pour télécharger l'image. Je souhaite effectuer d'autres opérations si l'image est téléchargée avec succès.

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. 
})

Mais j'obtiens une erreur: 

Impossible de convertir la valeur de type '(UIImage !, NSError !, SDImageCacheType, URL!) -> Annulation' en argument de type 'SDExternalCompletionBlock?'

7
Parvezkhan

Enfin résolu.

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

Swift 4 version

cell.appIcon.sd_setImage(with: url, placeholderImage: UIImage(named: "App-Default"),options: SDWebImageOptions(rawValue: 0), completed: { image, error, cacheType, imageURL in
     // your rest code
})

Important! N'oubliez pas de vous envoyer comme bloqué ou non possédé (comme ceci [self faible]/[moi non possédé]) au bloc, lorsque cela est nécessaire, pour éviter de conserver les cycles.

Exemple:

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

Selon la typedef du framework que vous utilisez:

typedef void(^SDExternalCompletionBlock)(UIImage * _Nullable image, NSError * _Nullable error, SDImageCacheType cacheType, NSURL * _Nullable imageURL);

une SDExternalCompletionBlock est constituée de paramètres facultatifs, comme indiqué par _Nullable. Votre code devrait donc être écrit comme ceci:

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. 
})

Comme le compilateur connaît les types de paramètres du bloc d'achèvement (à partir de la déclaration de fonction), vous pouvez écrire le code de manière plus succincte et (IMO) plus facile à lire comme ceci:

cell.appIcon.sd_setImage(with: url, placeholderImage: UIImage(named: "App-Default"), completed: { (image, error, cacheType, imageURL) in
      // Perform operation. 
})
3
jjatie

Celui-ci fonctionne également avec Swift 3:

cell.appIcon.sd_setImage(with: url, placeholderImage: UIImage(named: "App-Default"), options: []) { (image, error, imageCacheType, imageUrl) in
            // Perform your operations here.
}
2
Ankit Kumar Gupta
cell.appIcon.sd_setImage(with: url, placeholderImage: UIImage(named: "App-Default"),options: SDWebImageOptions(rawValue: 0), completed: { (img, err, cacheType, imgURL) in
     // code
}) 

Essayez ceci, espérons que cela fonctionnera bien

1
Muhammad Raza