Проблема с памятью при загрузке изображений Swift5 iOS13

Общий прирост памяти

Всякий раз, когда я получаю предупреждение о памяти, я очищаю кеши

func applicationDidReceiveMemoryWarning(_ application: UIApplication) {

        print("Memory warning...")
        imageCache.countLimit = 0
        imageCache.totalCostLimit = 0
        imageCache.removeAllObjects()
        SDImageCache.shared.clearMemory()
        URLCache.shared.removeAllCachedResponses()
    }

Это код для загрузки изображений и эскизов видео.

     func collectionView(_ collectionView: UICollectionView, 
          cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

      image_url = [InputSource]()
     if item.media_url?.contains(".mp4") ?? false
     {

         DispatchQueue.global().async {

             UIImage.getThumbnailImage(forUrl: url) { (image) in
                             DispatchQueue.main.async {

                             self.imageView_Video.image = image
                        }
                    }
                }
            }
            else{

                image_url.append(AlamofireSource(url: url , placeholder: UIImage(named: AppConstants.image_placeholder)))
            }
            }
  1. Чтобы загрузить изображение, я использую стороннюю библиотеку для создания слайд-шоу.
  2. Чтобы загрузить эскиз, я использую следующий код,

     static func getThumbnailImage(forUrl url: URL, completion: @escaping(_ 
      image: UIImage) -> Void) {
    
          DispatchQueue.global().async {
    
            do{
            let asset = AVURLAsset(url: url, options: nil)
            let imgGenerator = AVAssetImageGenerator(asset: asset)
            imgGenerator.appliesPreferredTrackTransform = true
            let cgImage = try imgGenerator.copyCGImage(at: CMTimeMake(value: 0, timescale: 1), actualTime: nil)
    
            DispatchQueue.main.async {
                let image = UIImage(cgImage: cgImage)
                completion(image)
            }
    
        } catch let error{
            print("*** Error generating thumbnail: \(error.localizedDescription)")
    
            DispatchQueue.main.async {
                completion(UIImage())
            }
        }
    }
    }
    

    Если я прокомментирую следующий код, приложение не выйдет из строя

            image_url.append(AlamofireSource(url: url , placeholder: 
                UIImage(named: AppConstants.image_placeholder)))
    

1 ответ

Я решил эту проблему, изменив метод загрузки изображения следующим образом:

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 
{
   if let medias = history?.medias
    {
        if medias.count > 0
        {
            slides = [];

            for item in medias{

                if let url = URL(string: item.media_url ?? " "){

                    if item.media_url?.contains(".mp4") ?? false
                    {

                        self.imageView_Video.backgroundColor = UIColor.black.withAlphaComponent(0.8)
                        DispatchQueue.global().async {

                            if let cachedImage = AppDelegate.shared.imageCache.object(forKey: "\(url)" as NSString) {
                                DispatchQueue.main.async {
                                    self.imageView_Video.image = cachedImage
                                }
                            }else{
                                UIImage.getThumbnailFromUrl("\(url)") { [weak self] (image) in
                                    DispatchQueue.main.async {
                                        if let img = image{
                                            AppDelegate.shared.imageCache.setObject(img, forKey: "\(url)" as NSString? ?? NSString())
                                            self?.imageView_Video.image = img
                                        }
                                    }
                                }
                            }

                        }
                    }
                    else{


                        let slide1:Slide = Bundle.main.loadNibNamed("Slide", owner: self, options: nil)?.first as! Slide

                        let processor = DownsamplingImageProcessor(size: CGSize(width: 500, height: 500))
                            |> RoundCornerImageProcessor(cornerRadius: 0)
                        slide1.imageView?.kf.setImage(
                            with: url,
                            placeholder: UIImage(named: "i_placeholder"),
                            options: [
                                .processor(processor),
                            ])
                        { [weak self]
                            result in
                            switch result {
                            case .success(let value):

                                self?.slides.append(slide1)

                            case .failure(let error):

                                slide1.imageView?.image = UIImage(named: "i_placeholder")
                                self?.slides.append(slide1)

                            }

                            self?.setupSlideScrollView(slides: self?.slides ?? [])
                        }

                    }//end else
                }//end if let url

            }
        }
    }
 }

Я удалил библиотеку слайд-шоу и добавил зимородка для загрузки изображений с высоким разрешением.

Другие вопросы по тегам