使用 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
}
}
}
感谢您的帮助。希望这也能帮助遇到同样问题的人。
美好的一天。
我目前使用的是 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
}
}
}
感谢您的帮助。希望这也能帮助遇到同样问题的人。