2015-05-31 4 views
0

Моя проблема заключается в том, что в моем приложении я загружаю изображения в виде таблицы. Когда я просматриваю вид таблицы, он очень медленный и иногда перестает прокручиваться. Я посмотрел в Интернете и увидел, что использование отправки поможет. Я пробовал это с помощью кода ниже, и мое приложение вылетает, говоря, что это нуль.Tableview прокрутка слишком медленная загрузка изображений

Код:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0)) { 

       let parseImage: PFFile = objectSong.valueForKey("picture") as PFFile 
       var pic: UIImage = UIImage(data: parseImage.getData())! 

        dispatch_async(dispatch_get_main_queue()) { 
         cell.imageView.image = pic <-- crash happens here 
        } 
       } 
      } 

Предыдущий код, используемый для загрузки просмотра таблицы ячеек:

 let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as TableViewCell 
     let objectSong: PFObject = object as PFObject 

     cell.songImage.image = UIImage(data: parseImage.getData()) 

ответ

0

Такой подход не может работать.

Помните, как работает таблица с многоразовыми ячейками. Одна и та же ячейка используется для разных строк. Поэтому, если вы загружаете изображение асинхронно и пытаетесь сохранить его в ячейке, ячейка может использоваться для другой строки. И вообще, вы устанавливаете изображение в фоновом потоке, и это вызовет проблемы.

Вот что вы делаете: вы копируете изображения. Когда ячейка загружена, вы ищете кэшированное изображение. Если он установлен, вы можете установить его, если он отсутствует, вы установите образ заполнителя и начнете загрузку.

Когда загрузка закончена, вы не можете поместить изображение в ячейку. Вместо этого вы добавляете его в кеш. Затем вы выясните, какая строка должна отображать изображение (в случае, если строки были добавлены или удалены), тогда вы перезагружаете эту строку в основном потоке. Затем перезагрузка будет извлекать изображение из кеша.

Смежные вопросы