J'ai quelques problèmes avec le code ci-dessous. Bien que cela fonctionne, il y a un problème de synchronisation. Tout d'abord, laissez-moi vous dire ce que j'attends, je suppose que le gestionnaire de complétion doit être lancé lorsque le téléchargement des données est terminé et que mon image est prête à être utilisée. Mais la réalité semble être très différente. Quand je l'essaie, le gestionnaire de complétion est appelé tout de suite (je peux voir 'Tout OK' dans la console) comme si tout était instantané. Mais l'image est effectivement affichée beaucoup plus tard. Qu'est-ce que je rate?session.dataTask problème de synchronisation
let imageURL = URL(string: myURLString)
session = URLSession.shared,
_ = session.dataTask(with: imageURL) {[weak self]
(data: Data?, response: URLResponse?, error: Error?) in
if error == nil {
print("All OK")
self?.theImage = UIImage(data: data!)
self?.theView.image = self?.theImage
} else {print(error!)}
DispatchQueue.main.async {
self?.activityIndicator.stopAnimating()
self?.theView.setNeedsDisplay()
}
}.resume()
Vous devez également avoir ajouté session.finishTasksAndInvalidate() juste avant vos dernières accolades} .resume() –
OK. Que voulez-vous dire par "le gestionnaire sera appelé à nouveau"? Il est déjà appelé. Est censé être appelé plusieurs fois? – Michel
Le contrôle atteint à nouveau le gestionnaire lorsque les données sont extraites. En outre, le self? .theView.image = self? .theImage devrait être sur le fil principal. Et quelle version de Swift utilisez-vous? –