Изображение слайдера UICollectionView не отображается

#ios #uicollectionview #swift4 #kingfisher

#iOS #uicollectionview #swift4 #kingfisher

Вопрос:

Я новичок в swift, я пытаюсь создать слайдер, используя UICollectionView, который работает должным образом,

но когда я пытаюсь реализовать cache ( Kingfisher ), он не показывает мои изображения в слайдере

вот моя реализация

 extension CompanyViewController: UICollectionViewDelegate, UICollectionViewDataSource {


func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
   if(self.sliderModel != nil){
    return (self.sliderModel?.data.count)!
   }else{
    return 0
    }
}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! BannerCollectionViewCell
    
     if(self.sliderModel != nil){
        
        if(self.sliderModel.data.count == indexPath.row){
            let url = URL(string:(self.sliderModel?.data[indexPath.row].experienceImage.addingPercentEncoding(withAllowedCharacters: CharacterSet.urlQueryAllowed ))!)
            cell.sliderImageView.kf.setImage(with: url)
        }else{
            //cell.sliderImageView.image = self.imgArr[indexPath.row]
            let url = URL(string:(self.sliderModel?.data[indexPath.row].experienceImage.addingPercentEncoding(withAllowedCharacters: CharacterSet.urlQueryAllowed ))!)
            cell.sliderImageView.kf.setImage(with: url)
        }
    }
    
    return cell
}
}
  

Но изображение не отображается в моем слайдере, я проверил свою модель, я получаю ответ от сервера, и изображения есть в URL-адресе изображения.
Возможно, я загружаю изображение не в том месте.

Вот как я получаю свои jsondata и присваиваю его в своей модели

 func getBannerData(){
         dispatchGroup.enter()
        let defaults = UserDefaults.standard
        let appId = defaults.string(forKey: Constants.APPID)
        let token = "Bearer " defaults.string(forKey: Constants.TOKEN)!
        if let url = URL(string: Constants.EXPERIENCE_BANNER_CENTER appId!){
            var request = URLRequest(url: url)
            request.httpMethod = "GET"
            request.setValue(token, forHTTPHeaderField:"Authorization")
            APIManager.sharedInstance.getCall(request: request){
                (data) in
                if(!data.isEmpty){
                    do{
                        self.sliderModel = try JSONDecoder().decode(SliderModel.self, from: Data(data.utf8))
                        DispatchQueue.main.async {
                            self.pageView.numberOfPages = (self.sliderModel?.data.count)!
                            self.sliderCollectionView.reloadData()
                           
                        }
                        self.timer = Timer.scheduledTimer(timeInterval: 2.0, target: self, selector: #selector(self.changeImage), userInfo: nil, repeats: true)
                        
                        self.stopActivityIndicator()
                        self.dispatchGroup.leave()
                    }
                    catch{
                        self.stopActivityIndicator()
                        self.showAlertMessage(alertMessage: Constants.COMMON_ERROR)
                    }
                    
                }
            }
        }
    }
  

Может кто-нибудь подсказать, что я делаю неправильно

Любая помощь будет оценена

Комментарии:

1. Существует некоторая подозрительная логика, возможно, не связанная с проблемой кэша. Зачем фиксировать количество элементов до 10, а не до длины sliderModel? Зачем обращаться к модели в строке-1? Для строки == 0 это отрицательный индекс массива.

2. Привет @danh Я обновил свой вопрос

3. Хорошо, теперь я думаю, что две ветви условия идентичны, и нулевая проверка модели слайдера (в cellForItem) является излишней, но это не объяснит проблему с изображением, если вы все еще испытываете ее. В качестве шага обучения я бы попытался доказать самому себе, пропустив всю сложность представления коллекции, могу ли я просто получить URL-адрес изображения из моей модели и использовать его для инициализации одного вида изображения, зависающего от основного вида.

4. привет, @danh, извините за сложность, и я попробовал только одно изображение, и видно только одно изображение, но оно не прокручивается и не загружает второе изображение, но если я попытаюсь загрузить изображение перед назначением, cellForItem оно будет работать нормально. я предполагаю, что это как-то связано с cellForItem

5. @danh Я тоже обновил свой вопрос, добавив еще несколько деталей и кода

Ответ №1:

То, что вы делаете, неправильно. Вы не можете подключиться к сети напрямую cellForItem . Конечно, вы можете попросить начать загрузку прямо сейчас, если это необходимо, но вы не можете сохранить ссылку cell , потому что пользователь может прокрутить ячейку вне поля зрения, и ее может потребоваться повторно использовать, пока загрузка все еще происходит.

Вместо этого вы должны загрузить в свою модель, а затем перезагрузить представление коллекции.

Комментарии:

1. Привет, @matt, можете ли вы поделиться какой-либо ссылкой, на которую я могу сослаться

2. @matt — Я мало что знаю о библиотеке кэширования изображений OP, но они обычно сохраняют сам вид изображения и обновляются после завершения сетевой задачи.