使用 Alamofire responseImage 从 URLRequest 加载图像 IOS swift

Loading Images from URLRequest using Alamofire responseImage IOS swift

美好的一天。

我目前使用的是 Alamofire 4.5 版和 xcode 9.3 版。我正在尝试使用此代码

将带有自定义 headers 的 URLrequest 图像加载到带有来自文件服务器的图像的 collection 视图
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")

将 headers 添加到 urlrequest 后,我​​使用此 alamofire responseimage 为图像设置值

            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 请求中循环了我拥有的 urlrequests 数量,但并非所有图像都在一次加载。另一件事,当我滚动 collection 查看我从 alamofire 调用加载的照片时,为了不遵循 indexpath.row 的顺序混乱。此外,我还尝试附加来自我的 alamofire 响应图像的图像响应并将其设置为 cell.imageView.image = self.imageArray[indexPath.row]

但它越界了。当我记录 alamofire imageresponse 时,它​​只加载到索引 7。我尝试了不同的方法,例如将 urlrequest 附加到数组并通过 collection 将其加载到视图单元格

cell.imageView.af_setImage(withURLRequest: imageURLRquest)

但它只加载图像数组中的第一项。很抱歉这个问题很长,因为我已经尝试了迄今为止找到的大部分解决方案,但它并没有解决我现在遇到的问题。请提供解决此问题的建议。提前谢谢你。

更新:

这是来自 alamofire 请求的数据源的代码。它 returns 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
    }

您在 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
    }

美好的一天。我已经找到了解决方案。您需要在 cellForItemAt 处将 imageView 的值重置为 nil,然后将其分配给 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
            }
        }
    }

感谢您的帮助。希望这也能帮助遇到同样问题的人。