gpt4 book ai didi

ios - UICollectionView 滚动 Alamofire 时在错误位置加载图像

转载 作者:行者123 更新时间:2023-11-30 13:12:55 24 4
gpt4 key购买 nike

问题是当第一次加载应用程序时,由于连接延迟,图像加载到错误的位置,当滚动集合时,图像将更改几次,直到滚动结束并且图像将消失返回到正确的图像。我不知道为什么会发生这种情况。加载应用程序后,图像将处于正确的位置。我使用 Alamofire 和 Alamofire Image。

模型通知:

import UIKit
import SwiftyJSON
import Alamofire
import AlamofireImage

class Noticia: NSObject {
//MARK: - Properties
var name:String = ""
var image:String = ""
var number:Int = 0
let photoCache = AutoPurgingImageCache(
memoryCapacity: 100 * 1024 * 1024,
preferredMemoryUsageAfterPurge: 60 * 1024 * 1024
)

override init() {

}

func setData(obj:JSON)->Noticia{
self.name = obj["titulo"].stringValue
self.image = obj["imagen_portada"].stringValue
self.number = Int(obj["id"].stringValue)!
return self
}

//MARK: - Image Caching

func cacheImage(image: Image, urlString: String) {
photoCache.addImage(image, withIdentifier: urlString)
}

func cachedImage(urlString: String) -> Image? {
return photoCache.imageWithIdentifier(urlString)
}

}

View Controller

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCellWithReuseIdentifier("Cell", forIndexPath: indexPath) as! NoticiaCell
let cell2 = collectionView.dequeueReusableCellWithReuseIdentifier("CellBillboard", forIndexPath: indexPath) as! BillboardCell
//Billboard Cell
if(indexPath.item == 0){
cell2.contact = noticia[indexPath.item]
return cell2
}else{
//Square News Cell
cell.contact = noticia[indexPath.item]
cell.layer.borderColor = ConstantProjectClass.colorBorderWebBizarro.CGColor
cell.layer.borderWidth = ConstantProjectClass.noticiasBorderWidth
//Layout custom
cell.setNeedsLayout()
cell.layoutIfNeeded()
return cell
}

}

Noticia细胞

import UIKit
import Alamofire
import AlamofireImage

class NoticiaCell: UICollectionViewCell {
//MARK: - Properties
@IBOutlet weak var labelView: UILabel!
@IBOutlet weak var imageView: UIImageView!
@IBOutlet weak var topLabelConstraint: NSLayoutConstraint!
@IBOutlet weak var topImageConstraint: NSLayoutConstraint!
var imageUrlString:String?

var contact:Noticia = Noticia(){
didSet{
self.labelView.text = self.contact.name

imageUrlString = self.contact.image

self.imageView.image = nil

if let imageFromCache = self.contact.cachedImage(imageUrlString!){
self.imageView.image = imageFromCache
return
}

Alamofire.request(.GET, self.contact.image)
.responseImage { response in
if let image = response.result.value {
dispatch_async(dispatch_get_main_queue(), {
let imageToCache = image
self.imageView.image = imageToCache
self.contact.cacheImage(imageToCache, urlString: self.contact.image)
})
}
}
}
}
}

有什么帮助吗?

最佳答案

阅读了几篇文章后,我找到了解决方案:

View Controller

    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCellWithReuseIdentifier("Cell", forIndexPath: indexPath) as! NoticiaCell
let cell2 = collectionView.dequeueReusableCellWithReuseIdentifier("CellBillboard", forIndexPath: indexPath) as! BillboardCell
print("entro")
//Billboard Cell
if(indexPath.item == 0){
cell2.contact = noticia[indexPath.item]
return cell2
}else{
//Square News Cell
cell.labelView.text = noticia[indexPath.item].name

imageUrlString = noticia[indexPath.item].image

cell.imageView.image = nil

if let imageFromCache = noticia[indexPath.item].cachedImage(imageUrlString!){
cell.imageView.image = imageFromCache

}else{

Alamofire.request(.GET, noticia[indexPath.item].image)
.responseImage { response in
if let image = response.result.value {
let imageToCache = image

if let updatedCell = collectionView.cellForItemAtIndexPath(indexPath) as? NoticiaCell{
updatedCell.imageView.image = imageToCache
}

self.noticia[indexPath.item].cacheImage(imageToCache, urlString: self.noticia[indexPath.item].image)

}
}
}

cell.layer.borderColor = ConstantProjectClass.colorBorderWebBizarro.CGColor
cell.layer.borderWidth = ConstantProjectClass.noticiasBorderWidth
//Layout custom
cell.setNeedsLayout()
cell.layoutIfNeeded()
return cell

}
}

关键是下面的代码:

if let updatedCell = collectionView.cellForItemAtIndexPath(indexPath) as? NoticiaCell{
updatedCell.imageView.image = imageToCache
}

关于ios - UICollectionView 滚动 Alamofire 时在错误位置加载图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38537510/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com