J'ai MainViewController
->ThumbnailViewController
->ImageFullScreenViewController
. Comme leur nom l'indique, j'ai un écran principal à partir duquel je vais sur un écran qui montre une collection d'images et en sélectionnant une image, j'ouvre l'image en plein écran.N'exécute pas le bloc si la tâche est annulée
En ThumbnailViewController
, je télécharger des images comme suit
private func getImages() {
self.galleryImages.removeAll()
for url in urls {
let task = NSURLSession.sharedSession().dataTaskWithURL(url) { (data, response, error) in
// errors are handled
if let image = UIImage(data: data) {
self.galleryImages.append(image!)
}
}
task.resume()
requests.append(task)
}
}
En viewDidLoad()
j'appelle getImages()
. Dans viewWillDisappear()
de ThumbnailViewController
, j'annule les tâches en cours.
override func viewWillDisappear(animated: Bool) {
super.viewWillDisappear(animated)
if isMovingFromParentViewController() {
if requests.count > 0 {
for request in requests {
if request is NSURLSessionDataTask {
let task = request as! NSURLSessionDataTask
task.cancel()
}
}
}
}
}
Le problème est, quand j'ouvre ThumbnailViewController
et immédiatement revenir en arrière et si j'ouvre ThumbnailViewController
immédiatement, je peux voir deux exemplaires de même image dans certains cas (rarement, mais reproductible).
Lors de l'enquête, j'ai constaté que l'annulation de NSURLSessionDataTask
dans viewWillDisappear
annule la tâche uniquement, mais pas le bloc d'achèvement (qui est le comportement). Dans de rares cas, le bloc d'achèvement est exécuté pour le précédent NSURLSessionDataTask
, terminant ainsi le mélange avec la réponse du nouveau NSURLSessionDataTask
.
Comment puis-je gérer cela?
Note: galleryImages
est une propriété singleton que je réutilisez dans ImageFullScreenViewController
(UIPageViewController
)
Sur un côté facile :) pourquoi ne pas simplement vérifier si l'image existe avant de l'ajouter à galleryImages en utilisant quelque chose comme galleryImages.contains (image) {...} –
Est-ce que la propriété compilée 'galleryImages' ou y a-t-il des observateurs? S'il vous plaît, montrez la déclaration. Il n'y a rien d'étrange, cette tâche parfois déjà sur le chemin de finir avec l'achèvement; étrange est comment il est capable de mélanger l'image reçue avec un tableau d'images dans * nouvelle * instance de 'ThumbnailViewController'. Cela peut arriver si 'galleryImages' est partagé d'une manière ou d'une autre. –
Désolé. J'aurais dû le mentionner. 'galleryImages' est un singleton. Je l'ai fait singleton, parce que, je réutilise le même tableau pour 'UIPageViewController' dans' ImageFullScreenViewController' – iOS