Ленивая загрузка изображений с использованием Alamofire и AlamofireImage Не работает при первой загрузке

Поэтому я пытаюсь следовать архитектуре 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()
            }
}

Проблема в том, что когда изображения загружаются в представление коллекции, отображаемые ячейки не получают загруженные изображения, но когда я прокручиваю их, более ранние ячейки получают свои изображения. Может ли кто-нибудь помочь мне лениво загружать изображения после их загрузки. (возможно, обработчик завершения, но я не знаю, куда его поставить). Закодированные ответы будут оценены.


person Abhishek Biswas    schedule 02.06.2017    source источник


Ответы (1)


Проблема в том, что изображение, загруженное из сети, не обновляется в ячейке после загрузки. Вам нужно сделать обратный вызов в блоке Alamofire.request. Решение:

Сначала добавьте блок обратного вызова в модель:

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 {
            //......
        }
    }
}

Во-вторых, в ячейке для обработки обратного вызова загруженного изображения для обновления изображения:

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

Попробуйте, должно получиться.

person Yun CHEN    schedule 02.06.2017
comment
где я должен поместить self.imageDidDownload?() в инициализатор - person Abhishek Biswas; 02.06.2017
comment
Что ж, теперь все изображения ячеек не загружаются и отображаются пустыми, а также не показывают загружаемое изображение. - person Abhishek Biswas; 02.06.2017
comment
Сохраните свой код, просто добавьте то, что добавил я. self.imageDidDownload?() стоит после self._image = image. Ваш код такой? - person Yun CHEN; 02.06.2017
comment
Возможно, исходное BrandImage.image = self.brand.image утеряно. Не могли бы вы проверить это? Я также обновил метод configureCell ответа. - person Yun CHEN; 02.06.2017
comment
Да .. Он работает нормально, как и ожидалось. Изображения загружаются лениво после их загрузки. Спасибо еще раз. Хорошего дня. - person Abhishek Biswas; 02.06.2017
comment
Рад помочь, ;) - person Yun CHEN; 02.06.2017