У меня есть 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()
из 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
(UIPageViewController
)
Об одном проще: почему бы вам просто не проверить, существует ли изображение, прежде чем добавлять его в galleryImages, используя что-то вроде galleryImages.contains (image) {...} –
Является ли вычисляемое свойство 'galleryImages' или у него есть какие-либо наблюдатели? Прошу показать объявление. Нет ничего странного, эта задача иногда уже на пути к завершению с завершением; странно, как он может смешивать полученное изображение с массивом изображений в * новом * экземпляре 'ThumbnailViewController'. Это может произойти, если «galleryImages» поделился каким-то образом. –
Извините. Я должен был упомянуть. 'galleryImages' - синглтон. Я сделал это singleton, потому что, я повторно использую тот же массив для 'UIPageViewController' в' ImageFullScreenViewController' – iOS