2016-08-30 3 views
0

У меня есть вид таблицы, показывающий результаты поиска. Он имеет массив всех объектов для поиска и массив фильтрованных объектов, которые подают представление таблицы.Обновление таблицы с результатами поиска, вызывающими сбои

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

Таким образом, два места, где перегружаются данные вид таблицы находятся в методе фильтрации, который вызывает tableView.reloadData(), и в cellForRowAtIndexPath, который вызывает self.tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimationStyle: .None) на главном потоке, если изображение нужно загрузить.

So. У меня были всевозможные проблемы. Три вида ошибок, которые я получил:

  • Неустранимая ошибка: индекс за пределами допустимого диапазона. Кажется, что это происходит, когда cellForRowAtIndexPath пытается получить содержимое из массива после того, как он был опустошен, потому что пользователь изменил текст поиска.
  • Ошибки с табличным представлением: например, ошибка, пытающаяся вставить строку 34 в раздел 0. Я не уверен, что вызывает это, но я думаю, что он пытается вставить строки, когда в представлении таблицы нет разделов из-за массив пуст.
  • Исключение внутренней несоответствия: я не получаю дополнительной информации, когда это происходит, она просто падает. Поэтому я не знаю, в чем проблема.

Так как я могу избежать этих проблем? Я уже пару дней пытаюсь избавиться от этих ошибок, но ничего не пытаюсь работать. У кого-нибудь есть идеи? Благодарю.

+0

Просьба предоставить некоторый код делегатов tableView для лучшего поиска проблемы. –

ответ

0

Благодаря кому-то в Reddit, я нашел ответ.

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

В основном, внутри cellForRowAtIndexPath, после определения изображения, необходимого для загрузки, а затем делать это асинхронно, я перешел от этого:

NSOperationQueue.mainQueue().addOperationWithBlock { 
    tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: .None) 
} 

к этому:

NSOperationQueue.mainQueue().addOperationWithBlock { 
    if indexPath == tableView.indexPathForCell(cell) { 
     cell.imageView?.image = downloadedThumbnail 
    } 
} 

Так как я сделал это я не получил никаких сбоев.

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