В настоящее время у меня есть collectionView: UICollectionView
, который отображает содержимое на основе массива объектов с именем projects
. Иногда я получаю обновленный массив с именем newProjects
с сервера. newProjects
должен заменить projects
в качестве источника данных для collectionView
.
Я нашел способ обновить collectionView
, когда объекты были удалены из массива, с помощью следующего кода:
var indexPaths = [IndexPath]()
for project in projects {
if(!newProjects.contains(project)) {
let index = projects.firstIndex(of: project)
indexPaths.append(IndexPath(item: index!, section: 0))
}
}
collectionView.deleteItems(at: indexPaths)
projects = newProjects
collectionView.reloadData()
Это работает для удаленных проектов. Тем не менее, я также пытаюсь реагировать на добавленные проекты. Однако мой код не работает, так как я получаю исключение:
Неверное обновление: недопустимое количество элементов в разделе 0. Количество элементов, содержащихся в существующем разделе после обновления (65), должно быть равно количеству элементов, содержащихся в этом разделе до обновления (64), плюс или минус количество элементов, вставленных или удаленных из этого раздела (0 вставлено, 0 удалено) и плюс или минус количество элементов, перемещенных в или из этого раздела (0 перемещено, 0 перемещено).
Мой код для сравнения добавленных проектов:
// First, the deletion from the code above is called.
// project = newProjects and data reload doesn't happen after deletion.
var addIndexPaths = [IndexPath]()
for project in newProjects {
if(!projects.contains(project)) {
projects.append(content)
addIndexPaths.append(IndexPath(item: projects.count - 1, section: 0))
}
}
collectionView.insertItems(at: addIndexPaths)
projects = newProject
collectionView.reloadData()
Я уверен, что этот код отчасти хакерский (поскольку он не работает), но я, честно говоря, не могу понять, как еще можно надежно обновить UICollectionView
. У кого-нибудь есть предложения или полезные ссылки? Ура!