Kingfisher 使用自定义图像视图下载多个图像
Kingfisher download multiple images with custom image view
我想使用 kingfisher 下载多张图片,并使用页面控件(如 instagram 主页供稿)在集合视图中显示这些图片。为此,我创建了自定义图像视图。我试过如下所示,但显示的图像都是一样的,即使 url 不同。我怎样才能解决这个问题?提前致谢!
import UIKit
import Kingfisher
class CustomImageView: UIImageView {
var lastUrlToLoad: String?
func loadMultipleImages(urlStrings: [String]) {
for urlString in urlStrings {
lastUrlToLoad = urlString
guard let url = URL(string: urlString) else { return }
let resouce = ImageResource(downloadURL: url, cacheKey: urlString)
KingfisherManager.shared.retrieveImage(with: resouce, options: nil, progressBlock: nil) { [weak self] (img, err, type, url) in
if err != nil {
return
}
if url?.absoluteString != self?.lastUrlToLoad {
return
}
DispatchQueue.main.async {
self?.image = img
}
}
}
}
}
编辑
我就是这样用这个方法的
class CollectionView: UICollectionViewCell {
@IBOutlet var imageView: CustomImageView!
var post: Post? {
didSet {
guard let urlStrings = post?.imageUrls else { return }
imageView.loadMultipleImages(urlStrings: urlStrings)
}
}
}
问题是您试图在单个图像视图中显示多个图像。结果,所有图像都被下载,但只显示最后检索到的图像。您可能想要 collection 查看照片,其中:
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return imageUrls.count
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
//dequeueReusableCell with imageView
cell.imageView.kf.setImage(with: imageUrls[indexPath.row])
return cell
}
您可以根据UICollectionViewDataSourcePrefetching
添加图片预取,Kingfisher也支持:
collectionView.prefetchDataSource = self
func collectionView(_ collectionView: UICollectionView, prefetchItemsAt indexPaths: [IndexPath]) {
ImagePrefetcher(urls: indexPaths.map { imageUrls[[=11=].row] }).start()
}
我想使用 kingfisher 下载多张图片,并使用页面控件(如 instagram 主页供稿)在集合视图中显示这些图片。为此,我创建了自定义图像视图。我试过如下所示,但显示的图像都是一样的,即使 url 不同。我怎样才能解决这个问题?提前致谢!
import UIKit
import Kingfisher
class CustomImageView: UIImageView {
var lastUrlToLoad: String?
func loadMultipleImages(urlStrings: [String]) {
for urlString in urlStrings {
lastUrlToLoad = urlString
guard let url = URL(string: urlString) else { return }
let resouce = ImageResource(downloadURL: url, cacheKey: urlString)
KingfisherManager.shared.retrieveImage(with: resouce, options: nil, progressBlock: nil) { [weak self] (img, err, type, url) in
if err != nil {
return
}
if url?.absoluteString != self?.lastUrlToLoad {
return
}
DispatchQueue.main.async {
self?.image = img
}
}
}
}
}
编辑
我就是这样用这个方法的
class CollectionView: UICollectionViewCell {
@IBOutlet var imageView: CustomImageView!
var post: Post? {
didSet {
guard let urlStrings = post?.imageUrls else { return }
imageView.loadMultipleImages(urlStrings: urlStrings)
}
}
}
问题是您试图在单个图像视图中显示多个图像。结果,所有图像都被下载,但只显示最后检索到的图像。您可能想要 collection 查看照片,其中:
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return imageUrls.count
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
//dequeueReusableCell with imageView
cell.imageView.kf.setImage(with: imageUrls[indexPath.row])
return cell
}
您可以根据UICollectionViewDataSourcePrefetching
添加图片预取,Kingfisher也支持:
collectionView.prefetchDataSource = self
func collectionView(_ collectionView: UICollectionView, prefetchItemsAt indexPaths: [IndexPath]) {
ImagePrefetcher(urls: indexPaths.map { imageUrls[[=11=].row] }).start()
}