Да, вам нужно переместить эту задачу в фоновый поток. Никогда не закручивайте основной поток с какой-либо задачей, выполнение которой занимает больше доли секунды. Игнорируя сторожевой таймер, который срабатывает только в экстремальных условиях, ваше приложение совершенно не реагирует на прикосновения или другие события во время этой длительной операции, и вы не можете предоставить пользователю обратную связь относительно хода этой операции.
Сторожевой таймер убьет приложение, которое блокирует основной поток в течение очень длительного периода времени, что делает приложение не реагирующим на ввод (я полагаю, что эта длительность в настоящее время составляет 20 секунд при запуске, но я не уверен, что это для того, когда приложение работает). Вы никогда не должны позволять вашему приложению доходить до того момента, когда сторожевой таймер его убивает, потому что это указывает на реальную проблему в том, как ваше приложение обрабатывает вещи.
Перемещение длительной задачи в фоновый поток само по себе является длительной темой, поэтому я рекомендую прочитать Руководство по программированию параллелизма Apple (обновлено) , а также посмотреть некоторые из их видеороликов WWDC на Тема перед началом.
Однако, на мой взгляд, самый элегантный способ справиться с длительными задачами - это использовать Grand Central Dispatch, где что-то вроде
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// Do your long-running task here
dispatch_async(dispatch_get_main_queue(), ^{
// Do callbacks to any UI updates here, like for a status indicator
});
});
вызовет выполнение вашей задачи в фоновом потоке в одной из глобальных параллельных очередей. Небольшой раздел кода в основном блоке показывает, как вы можете обновить любые элементы пользовательского интерфейса, такие как индикатор выполнения, из этой фоновой задачи. Как правило, обновления пользовательского интерфейса должны выполняться в главном потоке (с iOS 4.0 есть некоторые исключения, но в целом это хорошая практика).
Я также настоятельно рекомендую добавить некоторую визуальную индикацию состояния этой длительной задачи по мере ее выполнения. Ваши пользователи по достоинству оценят это, и оно заставит ваше приложение появиться быстрее, даже если оно может работать в течение той же продолжительности.