我有MainViewController
- > ThumbnailViewController
- > ImageFullScreenViewController
。顾名思义,我有一个主屏幕,我可以从屏幕上看到图像集合和选择图像,我全屏打开图像。
在ThumbnailViewController
中,我按如下方式下载图片
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)
}
}
在viewDidLoad()
我致电getImages()
。在viewWillDisappear()
的{{1}}中,我取消了正在进行的任务。
ThumbnailViewController
问题是,当我打开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()
}
}
}
}
}
并立即返回时,如果我立即打开ThumbnailViewController
,我可以在某些情况下看到相同图像的两个副本(很少,但可重复)。
经过调查,我发现,取消ThumbnailViewController
中的NSURLSessionDataTask
确实只取消了任务,但没有取消完成块(这是行为)。在极少数情况下,将对前一个viewWillDisappear
执行完成块,从而结束与新NSURLSessionDataTask
的响应的混合。
我怎么能处理这个?
注意:NSURLSessionDataTask
是我在galleryImages
(ImageFullScreenViewController
)重复使用的单例属性
答案 0 :(得分:0)
首先,您应该注意释放weak self
对象。使用self
声明捕获列表,并且它会在99%的情况下删除您的问题(如果您未在某些其他地方保留private func getImages() {
self.galleryImages.removeAll()
for url in urls {
let task = NSURLSession.sharedSession().dataTaskWithURL(url) { [weak self] (data, response, error) in
// errors are handled
// replace self. with self?.
if let image = UIImage(data: data) {
self?.galleryImages.append(image!)
}
}
task.resume()
requests.append(task)
}
}
),尽管您的模型仍然不完美
{{1}}