Прежде всего, в вашем коде есть большая ошибка проектирования.
С UITableViewDiffableDataSource
перестаньте думать в индексных путях и массивах источников данных. Вместо этого подумайте в источнике данных items .
В setupDataSource
вы всегда получаете элемент модели строки из массива источника данных currencyPairsArray
независимо от того, собираетесь ли вы отображать отфильтрованные данные или нет. Забудьте currencyPairsArray
и путь индекса. Воспользуйтесь третьим параметром в замыкании, представляющим элемент .
func setupDataSource() {
dataSource = UITableViewDiffableDataSource<Section, String>(tableView: tableView, cellProvider: { [weak self] (tableView, _, pair) -> UITableViewCell? in
let cell = tableView.dequeueReusableCell(withIdentifier: CurrencyPairCell.reuseIdentifier, for: indexPath) as! CurrencyPairCell
cell.delegate = self
cell.currencyPairLabel.text = pair.formattedPair()
cell.currencyPair = pair
return cell
})
}
Чтобы избавиться от предупреждения, выполните первую перезагрузку данных без анимации. , Добавьте логический параметр к performSearch
. И вместо проверки nil
проверка на пустую строку
func performSearch(with filter: String, animatingDifferences: Bool = true) {
var snapshot = NSDiffableDataSourceSnapshot<Section, String>()
let pairs : [String]
if filter.isEmpty {
pairs = currencyPairsArray.sorted()
} else {
pairs = currencyPairsArray.filter {$0.contains(filter)}
}
snapshot.appendSections([.main])
snapshot.appendItems(pairs, toSection: .main)
dataSource.apply(snapshot, animatingDifferences: animatingDifferences)
}
И никогда вызов tableView.reloadData()
при использовании UITableViewDiffableDataSource
, что, скорее всего, является причиной вашей проблемы.
Заменить
performSearch(with: nil)
fetcher.fetchCurrencyPairs { [weak self] pairsArray in
self?.currencyPairsArray.append(contentsOf: pairsArray)
DispatchQueue.main.async {
self?.tableView.reloadData()
}
}
на
fetcher.fetchCurrencyPairs { [weak self] pairsArray in
self?.currencyPairsArray.append(contentsOf: pairsArray)
DispatchQueue.main.async {
self?.performSearch(with: "", animatingDifferences: false)
}
}