Долгоиграющие задачи вообще не должны выпоняться в UI треде
Общепринятая практика - выносить их в фон, а потом возвращаться в главный поток
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
/* долгая операция */
dispatch_async(dispatch_get_main_queue(), ^{
/* обновляем ui*/
});
});
Вот тут немного подробней
idev.by/ios/21112
Т.е. общий план такой:
1) в init/viewDidLoad - где то там запускаете операцию, которая долго выполняется в фоновом потоке
2) Опционально отображаете крутилку
3) Когда операция закончена, забираете данные и на основе их обновляете ui
4) Опционально останавливаем отображение крутилки
4) Profit