UICollectionView застрял в reloadData

У меня проблемы с [UICollectionView reloadData], который довольно долго зависает, прежде чем вызывает numberOfSectionsInCollectionView для своего делегата, который я указал. Вот что происходит:

Приложение начинается с видимого UICollectionView, и делегат вызывается numberOfSectionsInCollectionView, который возвращает количество элементов в пустом массиве (т. е. 0) и немедленно начинает загружать данные для массива из веб-службы. После завершения загрузки данные десериализуются и добавляются в указанный выше массив, затем для экземпляра UICollectionView вызывается reloadData. Тут приложение как бы перестает что-либо делать, и через 20-30 секунд (иногда до минуты) делегат получает вызов numberOfSectionsInCollectionView. Как только этот вызов получен, перезагрузка быстро завершается.

Я считаю, что reloadData работает в своем собственном потоке, но я попытался запустить его в отдельном потоке, чтобы убедиться, что мой код не блокирует процесс. Что может делать reloadData, пока кажется, что он завис? Существуют ли какие-либо промежуточные методы делегата между reloadData и numberOfSectionsInCollectionView, которые мне следует реализовать? Я думал, что это первый метод, который будет вызываться после перезагрузки с точки зрения разработчика iOS.

Если бы кто-нибудь мог сказать мне, что может пойти не так, это фантастика, но я также был бы признателен за любые советы о том, как это отладить!


person Merott    schedule 03.11.2012    source источник
comment
Убедитесь, что reloadData вызывается в основном потоке. Также убедитесь, что вы не изменяете резервный массив из фонового потока.   -  person Felix    schedule 03.11.2012
comment
Гений @phix23! Сделайте это ответом, чтобы я мог принять ваш ответ.   -  person Merott    schedule 03.11.2012


Ответы (1)


Никогда не делайте вещи UIKit из фонового потока. Поэтому убедитесь, что reloadData вызывается в основном потоке, и не изменяйте резервный массив из фонового потока.

person Felix    schedule 03.11.2012
comment
Спасибо! Проблема заключалась в том, что reloadData не вызывался из основного потока. - person Merott; 03.11.2012
comment
@phix23 phix23 можно ли получить информацию о завершении reloadData, не помещая ее в основной поток? - person Yatheesha; 06.02.2016
comment
stackoverflow.com/questions/18796891/ - person Shaunti Fondrisi; 08.02.2016