insertRowsAtIndexPaths аварийно завершает работу при endUpdates в tableView: willDisplayCell: forRowAtIndexPath, только если пользователь быстро прокручивает - PullRequest
0 голосов
/ 13 октября 2011

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

Странно то, что если я прокручиваю медленно, то это работает нормально, но если я прокручиваю быстро, то происходит сбой [tableView endUpdates];

Источником данных является nsmutablearray, который загружает данные из coredata, используя общий fetchRequest.Я не могу использовать fetchedResultsController в моих текущих обстоятельствах.

Счетчик источника данных правильный до и после вызова вставки.Количество строк (и количество источников данных) являются правильными.

Если я прокручиваю медленно и позже в какой-то момент прокрутки быстро, происходит сбой, обычно с той же ошибкой, когда индекс находится за пределами границ, однако индекс играницы в сообщении об ошибке неверны с исходными значениями, когда таблица была впервые привязана (и до того, как произошли какие-либо вставки).Т.е. количество строк 4 и количество источников данных 4 и т. Д.

Это ошибка:

Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 3 beyond bounds [0 .. 2]'

Я также попытался вставить строки во время метода cellForRowAtIndexPath, но с тем же результатом.*

Есть идеи?

Ответы [ 2 ]

3 голосов
/ 14 октября 2011

Это неправильный способ решения проблем с прокруткой больших наборов данных.

  1. UITableView предназначен для хранения только небольшого числа ячеек в памяти одновременно.
  2. Попытка извлечения данных во время прокрутки будет работать ужасно, поскольку доступ к диску значительно медленнее, чем обновления пользовательского интерфейса.

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

Кстати, NSMutableArray редко используется при работе с результатами из Core Data.Если у вас нет конкретной причины иметь NSMutableArray, вы, вероятно, должны изменить его на NSArray.

0 голосов
/ 16 октября 2011

Заполняется ли NSMutableArray при запуске приложения?В настоящее время я предполагаю, что вы используете объект контроллера в качестве UITableViewDelegate, который просто возвращает конечное число строк, в то время как NSMutableArray заполняется при перемещении?

В этом случае загрузка из Core Dataможет быть слишком медленным, если вы ускорите прокрутку, что приведет к появлению «дыр» в массиве.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...