Это все связано с тем, как iOS обновляет пользовательский интерфейс. Когда вы звоните
[activityIndicator startAnimating];
это не означает, что нужно начать анимацию немедленно, это означает, что вы говорите пользовательскому интерфейсу при следующем обновлении дисплея, начинайте анимацию.
Все это обновление происходит в главном потоке (если вы не создали поток, вы уже в основном потоке), поэтому, если вы делаете что-то еще, что занимает много времени, оно сделает это перед обновлением дисплея .
Есть несколько способов исправить это, и все они включают создание другого потока, который работает в фоновом режиме.
Взгляните на NSOperation (и NSOperationQueue ) - это позволит вам ставить в очередь отдельные задачи, которые iOS будет выполнять в фоновом режиме для вас. затем, когда они будут готовы, вы можете снова обновить дисплей и отключить индикатор активности.
Есть Обучающие программы NSOperationQueue всего google :)
Надеюсь, это поможет.