Загрузка изображений из URLRequest с использованием Alamofire responseImage IOS swift - PullRequest
0 голосов
/ 22 мая 2018

Добрый день.

В настоящее время я использую Alamofire версии 4.5 и xcode версии 9.3.Я пытаюсь загрузить изображения из URLrequest с пользовательскими заголовками в коллекцию с изображением с файлового сервера, используя этот код

var imageRequest = URLRequest(url: URL(string: "myurl here ")!)
imageRequest.addValue(MyVariables.accountToken, forHTTPHeaderField: "accountToken")

imageRequest.addValue("header value 1", forHTTPHeaderField: "header field 1")

imageRequest.addValue("header value 2", forHTTPHeaderField: "header field 2")

imageRequest.addValue(imageurl from fileserver, forHTTPHeaderField: "file")

После добавления заголовков в URL-запрос я использую этот ответный образ alamofire, чтобы установить значение для изображения

            Alamofire.request(imageURLRequest).responseImage { response in
            if let image = response.result.value {
                self.count += 1
                print("image  \(self.count )", image)
            } else {
                print("unable to load   \(self.count)")
            }
        }

Проблема, с которой я сталкиваюсь, состоит в том, что не все изображения загружаются одновременно, хотя я уже зациклился в запросе alamofire с количеством URL-запросов, которые у меня есть.Другое дело, что когда я прокручиваю коллекцию, фотографии, загруженные из вызова alamofire, перемешиваются, чтобы не следовать indexpath.row.Кроме того, я также попытался добавить ответное изображение к своему ответному изображению alamofire и установить его на cell.imageView.image = self.imageArray[indexPath.row]

, но оно выходит за пределы.Когда я регистрирую ответ на изображение alamofire, он загружается только до индекса 7. Я попробовал другой подход, например добавление urlrequest в массив и загрузка его в ячейку представления коллекции через

cell.imageView.af_setImage(withURLRequest: imageURLRquest)

, но он загружает только первый элемент вмассив изображений.Извините за длинный вопрос, так как я пробовал большинство решений, которые я нашел до сих пор, но это не решает проблему, с которой я столкнулся сейчас.Пожалуйста, предоставьте предложения, чтобы это исправить.Заранее спасибо.

ОБНОВЛЕНИЕ:

Вот код источника данных из запроса alamofire.Возвращает 10 urlrequest, который добавляется к массиву

var imageRequest = URLRequest(url: URL(string: "myurl here ")!)
imageRequest.addValue(MyVariables.accountToken, forHTTPHeaderField: "accountToken")

imageRequest.addValue("header value 1", forHTTPHeaderField: "header field 1")

imageRequest.addValue("header value 2", forHTTPHeaderField: "header field 2")

imageRequest.addValue(imageurl from fileserver, forHTTPHeaderField: "file")

self.imageArray.append(imageRequest)

Это для cellForItemAt

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "BooksCell", for: indexPath) as! LibraryCollectionViewCell

        cell.imageView.af_setImage(withURLRequest: self.imageArray[indexPath.row])
        cell.bookName.text = self.booksObject[indexPath.row].object(forKey: "title") as! String
        cell.cosmosRatingView.rating = self.booksObject[indexPath.row].object(forKey: "rating") as! Double

        return cell
    }

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

Добрый день.Я уже нашел решение для этого.Вам нужно будет сбросить значение imageView на nil в cellForItemAt, а затем присвоить его indexPath.row

 if let image = self.bookImages[indexPath.row]  {
        cell.imageView.image = image
    } else {
        Alamofire.request(imageURLRequest).responseImage { response in
            if let image = response.result.value {
                cell.imageView.image = image
                self.bookImages[indexPath.row]  = image
            } else {
                cell.imageView.image = placeholderImage
            }
        }
    }

Спасибо за вашу помощь.Надеюсь, что это также помогает кому-то, кто столкнулся с той же проблемой.

0 голосов
/ 22 мая 2018

У вас ошибка при self.imageArray[indexPath.row], сбой при index goes out of bounds, потому что количество элементов в ячейке будет равно self.booksObject.count-1, что если self.booksObject больше, чем массив изображений?!

, значит, у вас естьчтобы убедиться, что self.imageArray.count = self.booksObject.count

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 
return self.booksObject.count 
}


func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "BooksCell", for: indexPath) as! LibraryCollectionViewCell

        cell.imageView.af_setImage(withURLRequest: self.imageArray[indexPath.row])
        cell.bookName.text = self.booksObject[indexPath.row].object(forKey: "title") as! String
        cell.cosmosRatingView.rating = self.booksObject[indexPath.row].object(forKey: "rating") as! Double

        return cell
    }
...