我有一个问题,我有一组高分辨率图像显示在UITableView中。
在缓存图像时,我做的事情不正确。我也尝试和失败了AlamofireImage库的类似实现,并且似乎在两个实现中滚动都不那么顺利。
但是,如果将图像调整为较小的分辨率,则不会出现任何问题。但是我要加载具有确切分辨率的图像。
谁能告诉我这可能是什么问题吗?
代码如下:
override func viewDidLoad() {
super.viewDidLoad()
for i in 1000...2000{
let url = "https://i.picsum.photos/id/\(i)/3000/2000.jpg";
imageUrlArray.append(url)
print(url)
}
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "ImageCellId") as! ImageTableViewCell
let imageUrl = imageUrlArray[indexPath.row]
cell.imgView.image = nil
cell.tag = indexPath.row
if let image = imageCache.object(forKey: indexPath.row as AnyObject){
DispatchQueue.main.async {
cell.imgView?.image = image as? UIImage
}
}
DispatchQueue.main.async {
let data = NSData(contentsOf: URL(string: imageUrl)!)
guard let imageData = data else{
return
}
DispatchQueue.main.async {
cell.imgView.image = UIImage(data:imageData as Data)
imageCache.setObject(imageData, forKey: indexPath.row as AnyObject)
print("Setting object")
}
}
return cell
}
[使用Alamofire:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "ImageCellId") as! ImageTableViewCell
let imageUrl = imageUrlArray[indexPath.row]
cell.imgView.image = nil
cell.tag = indexPath.row
Alamofire.request(imageUrl).responseData { response in
if case .success(let image) = response.result {
DispatchQueue.main.async {
if(cell.tag == indexPath.row){
guard let imageData = UIImage(data: image)else{
return
}
cell.imgView.image = imageData
}
}
}
}
return cell
}
无论您要获取的图像大小如何,都需要根据用户界面调整其大小。使用AlamofireImage的setImage(withURL:)
即可轻松完成。
例如,在AlamofireImage 4中:
let urls = (1000...2000).compactMap { URL(string: "https://i.picsum.photos/id/\($0)/3000/2000.jpg") } let placeholder = UIImage() let filter: AspectScaledToFillSizeFilter = { let scale = UIScreen.main.scale let size = CGSize(width: 50 * scale, height: 50 * scale) return AspectScaledToFillSizeFilter(size: size) }() override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "CustomCell", for: indexPath) as! CustomCell cell.customImageView.af.setImage(withURL: urls[indexPath.row], placeholderImage: placeholder, filter: filter) return cell }
此下载高分辨率图像,为图像视图适当调整其大小(在这种情况下,我的图像视图为50×50点,并进行内存中缓存。
如果要预取图像,则可以指定预取数据源:
override func viewDidLoad() { super.viewDidLoad() tableView.prefetchDataSource = self }
并下载图像:
extension ViewController: UITableViewDataSourcePrefetching {
func tableView(_ tableView: UITableView, prefetchRowsAt indexPaths: [IndexPath]) {
UIImageView.af.sharedImageDownloader.download(indexPaths.map { URLRequest(url: urls[$0.row]) })
}
}