【发布时间】:2025-12-10 10:20:05
【问题描述】:
我执行了以下代码并且工作得相当不错,但我没有找到在下载每个图像后重新加载 tableView 的方法。我正在使用 Alamofire 下载所有内容列表数据和图像。
如何从扩展访问 tableView?
如果有人能给我任何建议,我将不胜感激:)
import UIKit
import Alamofire
import AlamofireImage
class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
@IBOutlet weak var tableView: UITableView!
var jsonArray: NSArray?
var nameArray: Array<String> = []
var imageURLArray: Array<String> = []
override func viewDidLoad() {
super.viewDidLoad()
downloadDataFromAPI()
}
func downloadDataFromAPI(){
Alamofire.request("http://private-135b4e-solamente.apiary-mock.com/pokemonList") .responseJSON { response in
if let JSON = response.result.value{
self.jsonArray = JSON as? NSArray
for item in self.jsonArray! as! [NSDictionary]{
//5.
let name = item["name"] as? String
let imageURL = item["image"] as? String
self.nameArray.append((name)!)
self.imageURLArray.append((imageURL)!)
}
print(self.nameArray)
self.tableView.reloadData()
}
}
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.nameArray.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
{
let cell:UITableViewCell=UITableViewCell(style: UITableViewCell.CellStyle.subtitle, reuseIdentifier: "mycell")
cell.textLabel?.text = nameArray[indexPath.row]
cell.imageView!.downloaded(from: imageURLArray[indexPath.row])
return cell
}
}
extension UIImageView {
func downloaded(from url: URL, contentMode mode: UIView.ContentMode = .scaleAspectFit) { // for swift 4.2 syntax just use ===> mode: UIView.ContentMode
contentMode = mode
URLSession.shared.dataTask(with: url) { data, response, error in
guard
let httpURLResponse = response as? HTTPURLResponse, httpURLResponse.statusCode == 200,
let mimeType = response?.mimeType, mimeType.hasPrefix("image"),
let data = data, error == nil,
let image = UIImage(data: data)
else { return }
DispatchQueue.main.async() {
self.image = image
}
}.resume()
}
func downloaded(from link: String, contentMode mode: UIView.ContentMode = .scaleAspectFit) {
guard let url = URL(string: link) else { return }
downloaded(from: url, contentMode: mode)
}
}
【问题讨论】:
-
扩展
UIImageView不是一个好习惯。请注意,当用户滚动时,图像会一次又一次地下载。更好的解决方案是将图像添加到数据模型并在cellForRow中使用回调。如果单元格仍然可见,则图像会更新并缓存在模型中。当用户滚动时,如果可用,则从模型中获取图像。 -
谢谢我去试试
标签: ios swift uitableview alamofire