У меня есть UITableView
, который отображает агрегированный поток сообщений из нескольких RSS-каналов.Всякий раз, когда мое приложение извлекает новые сообщения из канала, я создаю объект, представляющий все необходимые вставки и удаления, необходимые для обновления UITableView
текущих строк.Я помещаю эти объекты в массив, который я использую в качестве очереди FIFO.Каждые несколько секунд я вытаскиваю первый элемент из этого массива и пытаюсь выполнить все вставки и удаления в UITableView
, используя функцию UITableView:performBatchUpdates
.
. Все это прекрасно работает ... так долгопоскольку пользователь не прокручивает UITableView
вверх и вниз.Если происходит прокрутка, обновления прекращаются, потому что я устанавливаю флаг, чтобы всегда ждать, пока завершится последний набор вставок / удалений, прежде чем начинать следующий пакет, и, к сожалению, иногда закрытие завершенияUITableView:performBatchUpdates
никогда не вызывается, поэтому мой флаг никогда не сбрасывается.
Вот код, который я использую для обработки своей входящей очереди изменений для UITableView
:
@objc func updateFeedPostsTableView() {
guard feedUpdateQueue.count > 0,
!feedTableUpdateInProgress else { return }
feedTableUpdateInProgress = true
let feedUpdate = feedUpdateQueue.first!
feedUpdateQueue.remove(at: 0)
self.aggregatedRSSFeed = feedUpdate.feed
self.feedPostsTableView.performBatchUpdates ({
self.feedPostsTableView.deleteRows(at: feedUpdate.indexPathsOfDeletedPosts,
with: .fade)
self.feedPostsTableView.insertRows(at: feedUpdate.indexPathsOfNewPosts,
with: .top)
},
completion: { (success) in
self.feedTableUpdateInProgress = false
}
)
}
Мой вопрос: почему бы UITableView.performBatchUpdates
когда-либо не вызвать его блок завершения?Что я тут не так делаю?
Это iOS 11.2, использующая версию Xcode 9.2.
Спасибо!