Опишите техническую проблему, с которой вы столкнулись, и как её решили.

«Опишите техническую проблему, с которой вы столкнулись, и как её решили.» — вопрос из категории Софт-скиллы, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый пример ответа, который можно адаптировать под свой опыт.

Ответ

Проблема: Реализация бесконечного скролла в UICollectionView с использованием prefetchDataSource привела к race condition и некорректному отображению данных. При быстром скролле ячейки переиспользовались, а асинхронные запросы данных завершались в произвольном порядке, подставляя старые данные в новые ячейки.

Решение: Введение уникального идентификатора (UUID) для каждого запроса данных, связанного с конкретной ячейкой на момент начала загрузки.

Код решения:

class CustomCell: UICollectionViewCell {
    var currentRequestID: UUID? // Идентификатор активного запроса для этой ячейки
}

func collectionView(_ collectionView: UICollectionView, prefetchItemsAt indexPaths: [IndexPath]) {
    for indexPath in indexPaths {
        guard let cell = collectionView.cellForItem(at: indexPath) as? CustomCell else { continue }

        let requestID = UUID() // Генерируем новый уникальный ID
        cell.currentRequestID = requestID // Привязываем его к ячейке

        loadData(for: indexPath) { [weak cell] result in
            // Проверяем, актуален ли запрос для этой ячейки сейчас
            guard let cell = cell, cell.currentRequestID == requestID else {
                return // Запрос устарел, ячейка уже готовится для других данных
            }
            cell.configure(with: result) // Безопасное обновление UI
        }
    }
}

Вывод: При работе с асинхронными операциями и переиспользуемыми UI-компонентами необходимо всегда проверять актуальность контекста перед обновлением интерфейса.