Я создаю приложение, которое использует collectionView для отображения рецептов. Когда пользователь прокручивает страницу вниз, я вызываю свой сервер и получаю другие рецепты. В настоящее время я вызываю reloadData () после того, как сервер отвечает новыми рецептами. Это работает, но перезагружает все, когда мне нужно только загрузить новые рецепты. Я читал похожие сообщения, указывающие, что я могу использовать insertItems, но для меня это сбой: libC++ abi.dylib: завершение с неперехваченным исключением типа NSException
Вот мой код:
func updateRecipes(recipesToAdd: Array<Recipe>) {
let minNewRecipesIndex = (self.recipes.count + 1)
recipes += recipesToAdd
DispatchQueue.main.async {
if recipesToAdd.count == self.recipes.count {
self.collectionView?.reloadData()
} else {
let numberOfItems: [Int] = Array(minNewRecipesIndex...self.recipes.count)
self.collectionView?.insertItems(at: numberOfItems.map { IndexPath(item: $0, section: 0) })
// this crashes, but self.collectionView.reloadData() works
}
}
}
Даже простой жестко запрограммированный - self.collectionView? .InsertItems (at: IndexPath (item: 1, section: 0)) - дает сбой.





Две проблемы:
minNewRecipesIndex должен быть self.recipes.count. Представьте пустой массив (.count == 0), индекс для вставки элемента в пустой массив равен 0, а не 1.
numberOfItems должен быть Array(minNewRecipesIndex...self.recipes.count - 1) или Array(minNewRecipesIndex..<self.recipes.count). Снова представьте пустой массив. Два элемента вставляются в индексы 0 и 1, minNewRecipesIndex - 0, а self.recipes.count - 2, поэтому вам нужно уменьшить значение или использовать оператор полуоткрытия.
Если код по-прежнему дает сбой, используйте цикл for, завернутый в beginUpdates() / endUpdates(), и вставляйте элементы один за другим в последний индекс.
Спасибо! Ага, я думал, что тестирование с жестко запрограммированными индексами исключило возможность того, что мои индексы не работают.