J'ai créé une tableView avec des cellules personnalisées pour lesquelles chaque cellule a une image.Les images ne peuvent pas être affichées dans la vue de tableau
Dans la classe modèle, j'ai créé un func mainPulatesData()
utiliser URLSession
méthode dataTask pour récupérer des données à partir de l'URL, et convertir les données en UIImage
dans le bloc du gestionnaire d'achèvement, puis ajouter une image dans une variable de tableau de UIImage
.
Le processus de récupération des données et leur ajout dans le tableau UIImage
a été exécuté dans le bloc DispatchQueue.global(qos: .userInitiated).async
. en fonction du message d'impression, les images ont été ajoutées dans le tableau.
Cependant, même si j'ai créé une instance de classe de modèle dans le contrôleur tableView et invoque le mainPulatesData()
dans viewDidlLoad
, l'image n'apparaissait pas dans la table. Basé sur un autre message d'impression dans la classe de contrôleur de vue de table, j'ai même trouvé qu'il peut être ajouté dans un tableau dans la classe de modèle, mais il semble ne pas fonctionner sur l'instance de la classe de modèle dans le contrôleur tableView.
qui est le code dans la classe de modèle pour obtenir des données d'image:
func mainPulatesData() {
let session = URLSession.shared
if myURLs.count > 0{
print("\(myURLs.count) urls")
for url in myURLs{
let task = session.dataTask(with: url, completionHandler: { (data,response, error) in
let imageData = data
DispatchQueue.global(qos: .userInitiated).async {
if imageData != nil{
if let image = UIImage(data: imageData!){
self.imageList.append(image)
print("\(self.imageList.count) images added.")
}
}
else{
print("nil")
}
}
})
task.resume()
}
}
}
qui est le code dans le contrôleur de vue de créer une instance de modèle:
override func viewDidLoad() {
super.viewDidLoad()
myModel.mainPulatesURLs()
myModel.mainPulatesData()
loadImages()
}
private func loadImages(){
if myModel.imageList.count > 0{
tableView.reloadData()
}
else{
print("data nil")
}
}
override func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return myModel.imageList.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "imageCell", for: indexPath) as! ImageTableViewCell
if myModel.imageList.count > 0{
let image = myModel.imageList[indexPath.row]
cell.tableImage = image
return cell
}
return cell
}
c'est le concept de chargement paresseux. Pour cela, vous pouvez utiliser SDWebImage (bibliothèque tierce) –