使用 Alamofire 和 AlamofireImage 延迟加载图像在第一次加载时不工作
Lazy loading of images using Alamofire and AlamofireImage Not working at first Load
所以我试图在这个应用程序中遵循 mvc 架构。这是图像部分的代码。
型号
import Alamofire
import AlamofireImage
class Brands {
private var _image : UIImage!
var image : UIImage {
if _image == nil {
_image = UIImage(named: "loadingImage")
}
return _image
}
init(BrandsDict : Dictionary<String, AnyObject>){
if let imageUrl = BrandsDict["imageUrl"] as? String{
Alamofire.request(imageUrl).responseImage(completionHandler: { (response) in
guard let image = response.result.value else {
self._image = UIImage(named: "loadingImage")
return
}
self._image = image
})
}else {
self._image = UIImage(named : "loadingImage")
}
查看
class BrandsCVCell : UICollectionViewCell {
@IBOutlet weak var BrandImage : UIImageView!
var brand : Brands!
func configureCell(_ brand : Brands){
self.brand = brand
BrandImage.image = self.brand.image
}
}
控制器
inViewDidLoad
....
if let jsonArray = data as? NSArray {
for objects in jsonArray {
let Brand = Brands(BrandsDict: objects as! Dictionary<String, AnyObject>)
self.Brands.append(Brand)
}
self.bestBrandCollection.reloadData()
}
....
if collectionView == BrandCollection {
if let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "BrandsCell", for: indexPath) as? BrandCollectionViewCell {
let Brand = Brands[indexPath.row]
cell.configureCell(Brand)
return cell
}else {
return UICollectionViewCell()
}
}
问题是,当图像加载到集合视图中时,正在显示的单元格不会获取下载的图像,但是当我滚动它们时,较早的单元格会获取它们的图像。下载后有人可以帮我延迟加载图像吗? (也许是完成处理程序,但我不知道把它放在哪里)。编码答案将不胜感激。
问题是从网络下载的图片在下载后没有刷新到单元格中。您需要在 Alamofire.request
块中回调。解决方案:
首先,在model中添加block回调:
class Brands {
//......
public var imageDidDownload:(()->Void)? //Key point, declare a callback block
init(BrandsDict : Dictionary<String, AnyObject>){
if let imageUrl = BrandsDict["imageUrl"] as? String{
Alamofire.request(imageUrl).responseImage(completionHandler: { (response) in
//......
self._image = image
self.imageDidDownload?() //Key point, callback after image downloaded
//......
})
}else {
//......
}
}
}
第二个,在cell中,处理图片下载回调刷新图片:
class BrandsCVCell : UICollectionViewCell {
//......
func configureCell(_ brand : Brands){
self.brand = brand
self.brand.imageDidDownload = { [weak self]() -> Void in
self?.BrandImage.image = self?.brand.image //Key point, refresh image to the imageView after downloading.
}
BrandImage.image = self.brand.image
}
}
试试吧,应该有用。
所以我试图在这个应用程序中遵循 mvc 架构。这是图像部分的代码。
型号
import Alamofire
import AlamofireImage
class Brands {
private var _image : UIImage!
var image : UIImage {
if _image == nil {
_image = UIImage(named: "loadingImage")
}
return _image
}
init(BrandsDict : Dictionary<String, AnyObject>){
if let imageUrl = BrandsDict["imageUrl"] as? String{
Alamofire.request(imageUrl).responseImage(completionHandler: { (response) in
guard let image = response.result.value else {
self._image = UIImage(named: "loadingImage")
return
}
self._image = image
})
}else {
self._image = UIImage(named : "loadingImage")
}
查看
class BrandsCVCell : UICollectionViewCell {
@IBOutlet weak var BrandImage : UIImageView!
var brand : Brands!
func configureCell(_ brand : Brands){
self.brand = brand
BrandImage.image = self.brand.image
}
}
控制器
inViewDidLoad ....
if let jsonArray = data as? NSArray {
for objects in jsonArray {
let Brand = Brands(BrandsDict: objects as! Dictionary<String, AnyObject>)
self.Brands.append(Brand)
}
self.bestBrandCollection.reloadData()
}
....
if collectionView == BrandCollection {
if let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "BrandsCell", for: indexPath) as? BrandCollectionViewCell {
let Brand = Brands[indexPath.row]
cell.configureCell(Brand)
return cell
}else {
return UICollectionViewCell()
}
}
问题是,当图像加载到集合视图中时,正在显示的单元格不会获取下载的图像,但是当我滚动它们时,较早的单元格会获取它们的图像。下载后有人可以帮我延迟加载图像吗? (也许是完成处理程序,但我不知道把它放在哪里)。编码答案将不胜感激。
问题是从网络下载的图片在下载后没有刷新到单元格中。您需要在 Alamofire.request
块中回调。解决方案:
首先,在model中添加block回调:
class Brands {
//......
public var imageDidDownload:(()->Void)? //Key point, declare a callback block
init(BrandsDict : Dictionary<String, AnyObject>){
if let imageUrl = BrandsDict["imageUrl"] as? String{
Alamofire.request(imageUrl).responseImage(completionHandler: { (response) in
//......
self._image = image
self.imageDidDownload?() //Key point, callback after image downloaded
//......
})
}else {
//......
}
}
}
第二个,在cell中,处理图片下载回调刷新图片:
class BrandsCVCell : UICollectionViewCell {
//......
func configureCell(_ brand : Brands){
self.brand = brand
self.brand.imageDidDownload = { [weak self]() -> Void in
self?.BrandImage.image = self?.brand.image //Key point, refresh image to the imageView after downloading.
}
BrandImage.image = self.brand.image
}
}
试试吧,应该有用。