У меня есть настроенный UITableViewCell с некоторыми атрибутами. Цель состоит в том, чтобы обновить каждую ячейку другим фоновым изображением (загружаемым из сети асинхронно). У меня есть десять ячеек, чтобы показать, но проблема в том, что нижние 5 ячеек всегда показывают первые пять загруженных изображений (которые загружаются для 5 лучших ячеек).UITableViewCell backgroundView изображение не загружается и показывает правильные изображения
Чтобы избежать загрузки изображений снова, когда ячейка перезагружается при прокрутке пользователя, я использую атрибут ячейки таблицы, называемый isImageLoaded. См. Фрагмент ниже. Попробовал несколько решений, чтобы исправить это безрезультатно. Я также показываю текстовые атрибуты для этих ячеек (не загружаются через HTTP-запросы), и они показывают правильные значения для всех 10 ячеек, прокручивающих вверх и вниз.
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
var cell:ImageTableCell = self.tableView.dequeueReusableCellWithIdentifier(cellIdentifier) as! ImageTableCell
cell.tag = indexPath.section
// cell.imageLoaded is initialized as false in the custom cell settings
if !(cell.imageLoaded) {
var photourl:String = "http://someurl/image" + String(indexPath.section)
downloadImage(cell, url: NSURL(string: photourl)!)
}
}
func downloadImage(cell:HomeSummaryTableCell, url:NSURL){
cell.activityindicator.startAnimating()
println("Started downloading \"\(url.lastPathComponent!.stringByDeletingPathExtension)\".")
getDataFromUrl(url) { data in
dispatch_async(dispatch_get_main_queue()) {
println("Finished downloading \"\(url.lastPathComponent!.stringByDeletingPathExtension)\".")
var imageView:UIImageView = UIImageView(image: UIImage(data: data!))
imageView.contentMode = UIViewContentMode.ScaleAspectFill
imageView.clipsToBounds = true
cell.backgroundView = imageView
cell.activityindicator.stopAnimating()
cell.imageLoaded = true
}
}
}
func getDataFromUrl(urL:NSURL, completion: ((data: NSData?) -> Void)) {
NSURLSession.sharedSession().dataTaskWithURL(urL) { (data, response, error) in
completion(data: data)
}.resume()
}
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 10
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 1
}
Работы (спасибо), но с накладными расходами на загрузку изображения и обновление ячейки. Это означает, что я должен правильно использовать логику imageLoaded, чтобы избежать повторной загрузки. Будет работать и обновлять, как это происходит. – sysuser
Да, для этого вам нужно использовать кеширование изображений. Вы можете создавать свои собственные или искать cocoapods;) –