#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, но они обычно сохраняют сам вид изображения и обновляются после завершения сетевой задачи.