В моем приложении я построил собственный класс загрузки асинхронных изображений. Я передаю объект, затем он проверяет, имеет ли кэш (NSCache) изображение, если он не будет проверять файловую систему, если изображение уже сохранено. Если изображение уже не сохранено, оно будет загружать изображение в фоновом режиме (Справка NSOperations).UITableViewCell асинхронно загружает проблемы с изображениями - Swift
Это прекрасно работает до сих пор, но я столкнулся с несколькими небольшими проблемами, когда изображение таблицы загружает изображения.
Во-первых, это функция я использую, чтобы настроить вид таблицы ячейки из tableView(tableView:, willDisplayCell:, forRowAtIndexPath:)
func configureCell(cell: ShowTableViewCell, indexPath: NSIndexPath) {
// Configure cell
if let show = dataSource.showFromIndexPath(indexPath) {
ImageManager.sharedManager.getImageForShow(show, completionHandler: { (image) -> Void in
if self.indexPathsForFadedInImages.indexOf(indexPath) == nil {
self.indexPathsForFadedInImages.append(indexPath)
if let fetchCell = self.tableView.cellForRowAtIndexPath(indexPath) as? ShowTableViewCell {
func fadeInImage() {
// Fade in image
fetchCell.backgroundImageView!.alpha = 0.0
fetchCell.backgroundImage = image
UIView.animateWithDuration(showImageAnimationSpeed, animations: {() -> Void in
fetchCell.backgroundImageView!.alpha = 1.0
})
}
if #available(iOS 9, *) {
if NSProcessInfo.processInfo().lowPowerModeEnabled {
fetchCell.backgroundImage = image
}
else {
fadeInImage()
}
}
else {
fadeInImage()
}
}
else {
// Issues are here
}
}
else {
// Set image
cell.backgroundImage = image
}
})
...
}
Где «// Проблемы здесь» комментарий, то есть, где я бегу на несколько вопросов.
До сих пор я не понял другого способа проверить, что изображение принадлежит ячейке, где «// Проблемы здесь». Если добавить
cell.backgroundImage = IMAGE
там, то это устраняет проблему, где иногда изображение не будет отображаться на табличной ячейке. Пока единственная причина, по которой я нашел это, заключается в том, что изображение возвращается быстрее, чем я могу вернуть ячейку представления таблицы, поэтому в представлении таблицы указано, что на этом пути указана не ячейка.
Но если я добавлю этот код там, тогда я столкнусь с другой проблемой! Ячейки будут отображать неправильные изображения, а затем он отстает от приложения, и изображение будет постоянно переключаться или даже просто оставаться на неправильном изображении.
Я проверил, что он работает по основной теме, загрузка изображений и кеширование - все в порядке. Он просто должен сделать, что в таблице говорится, что на этом пути указана не ячейка, и я попытался получить индексную ячейку для ячейки, которая возвращает также нуль.
Полу-решение этой проблемы называется tableView.reloadData() в viewWillAppear/viewDidAppear. Это устранит проблему, но затем я потеряю анимацию для ячеек таблицы на экране.
EDIT:
Если я прохожу вид изображения в getImageForShow() и установить его непосредственно будет решить эту проблему, но это менее идеальный дизайн кода. Очевидно, что вид изображения существует, ячейка существует, но по какой-то причине она не хочет работать каждый раз.
Я сделал это несколько иначе, но переменная генерации работает. Я сохраняю свой код configureCell там, где он есть, и просто проверяю его там, и из того, что я могу сказать, изображения всегда правильные. Спасибо :) – Maximilian
У этого есть проблема, что изображения не установлены правильно при прокрутке вверх, потому что вы всегда увеличиваете значение генерации в prepareForReuse. – BalestraPatrick