Advertisement
Alexxik

Untitled

Mar 22nd, 2024
336
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Swift 2.92 KB | None | 0 0
  1.  
  2. struct Banner: Decodable {
  3.     let bannerImageUrl: String
  4.    
  5.     // coding keys
  6. }
  7.  
  8. protocol ImageBannerService {
  9.     func load(completion: @escaping (([Banner]?, Error?) -> Void))
  10.     func load(_ image: URL, completion: @escaping ((UIImageView?, Error?) -> Void))
  11. }
  12.  
  13. class ImageBannerServiceImpl {
  14.     func load(completion: @escaping (([Banner]?, Error?) -> Void)) {
  15.         DispatchQueue.global(qos: .background).async {
  16.             let banners: [Banner] = []
  17.             completion(banners, nil)
  18.         }
  19.     }
  20.      
  21.     func load(_ image: URL, completion: @escaping ((UIImageView?, Error?) -> Void)) {
  22.         DispatchQueue.global(qos: .background).async {
  23.             // .. код загрузки изображения из сети
  24.             let data = Data(contentsOf: image)
  25.             let loadedImage = UIImage(data: data)
  26.             let imageView = UIImageView(image: loadedImage)
  27.             completion(imageView, nil)
  28.         }
  29.     }
  30. }
  31.  
  32. class BannerCollectionViewController: UIViewController, UICollectionViewDataSource {
  33.  
  34.     let service: ImageBannerService = ImageBannerServiceImpl()
  35.      
  36.     lazy var collectionView: UICollectionView = {
  37.         let collectionView = UICollectionView()
  38.         collectionView.dataSource = self
  39.         return collectionView
  40.     }()
  41.      
  42.     var banners = [Banner]()
  43.      
  44.     override func viewDidLoad() {
  45.         view.backgroundColor = .white
  46.         view.addSubview(collectionView)
  47.         NSLayoutConstraint.activate([
  48.         ])
  49.                  
  50.  
  51.         service.load { [weak self] banners, error in
  52.             DispatchQueue.main.async {
  53.                 self?.banners = banners!
  54.                 self?.collectionView.reloadData()
  55.             }
  56.         }
  57.     }
  58.      
  59.     func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
  60.         return banners.count
  61.     }
  62.  
  63.     func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
  64.         guard let cell = collectionView.dequeueReusable(for: id, indexPath: indexPath) as? BannerCell else { return UICollectionViewCell() }
  65.  
  66.         let banner = banners[indexPath.row]
  67.         let imageUrlString = banner.banner_image_url
  68.         guard let image = banners[indexPath.row].banner_image_url  else { return cell }
  69.  
  70.         cell.currentUrlString = imageUrlString
  71.         service.load(image) { imageView, error in
  72.             if imageUrlString == cell.currentUrlString,
  73.                let imageView {
  74.                     DispatchQueue.main.async {
  75.                         cell.imageView = imageView
  76.                     }
  77.                 }
  78.         }
  79.          
  80.         return cell
  81.     }
  82. }
  83.  
  84.  
  85.  
  86. class BannerCell: UICollectionViewCell {
  87.     var imageView: UIImageView
  88.     var currentUrlString: String?
  89.  
  90.     override func prepareForReuse() {
  91.         closure = nil
  92.         currentUrlString = nil
  93.     }
  94. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement