I am using af_setImageWithURL
Alamofire API to fetch the table cell images and pass a default placeholder image:
let defaultImage = UIImage(named:"myImage")
cell.imageView.af_setImageWithURL(imageURL, placeholderImage:defaultImage, imageTransition: .CrossDissolve(0.1))
Problem: When my image does not exists at the downloading path, cell do not show the default image as well. When I scroll the table up & down (to purge and re-use the same cell) then it shows up.
EDIT:
Noticed this is happening after dequeuing the cell, I reset the image first and then call Alamofire. If I comment out below line, it works fine but then I am running into a risk of showing old product image if both image URL and default images are not available.
cell.imageView.image = nil
Anybody faced similar issue, please advise.
You need to make sure you cancel your request and also nil
out the image in prepareForReuse
. Otherwise you can run into a few different problems. Here's the ImageCell
class in the iOS Example
in AFI.
class ImageCell: UICollectionViewCell {
class var ReuseIdentifier: String { return "org.alamofire.identifier.\(type(of: self))" }
let imageView: UIImageView
// MARK: - Initialization
override init(frame: CGRect) {
imageView = {
let imageView = UIImageView(frame: frame)
imageView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
imageView.contentMode = .center
imageView.clipsToBounds = true
return imageView
}()
super.init(frame: frame)
contentView.addSubview(imageView)
imageView.frame = contentView.bounds
}
required init(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
// MARK: - Lifecycle Methods
func configureCell(with URLString: String, placeholderImage: UIImage) {
let size = imageView.frame.size
imageView.af_setImage(
withURL: URL(string: URLString)!,
placeholderImage: placeholderImage,
filter: AspectScaledToFillSizeWithRoundedCornersFilter(size: size, radius: 20.0),
imageTransition: .crossDissolve(0.2)
)
}
override func prepareForReuse() {
super.prepareForReuse()
imageView.af_cancelImageRequest()
imageView.layer.removeAllAnimations()
imageView.image = nil
}
}
Cheers. 🍻