Как выполнять длительные операции, не будучи убитыми сторожем? iphone - PullRequest
2 голосов
/ 16 декабря 2011

У меня есть важная операция, которая выполняется редко.В некоторых случаях выполнение может занять несколько минут.Мое приложение убивается после 50 секундной операции.Как этого избежать?

Должен ли я поместить его в фоновом потоке?Может ли кто-нибудь, пожалуйста, указать мне в правильном направлении здесь.Я не нашел никакой полезной информации о так называемом сторожевом таймере.Фоновый поток - это путь?

Ответы [ 2 ]

8 голосов
/ 16 декабря 2011

Да, вам нужно переместить эту задачу в фоновый поток. Никогда не закручивайте основной поток с какой-либо задачей, выполнение которой занимает больше доли секунды. Игнорируя сторожевой таймер, который срабатывает только в экстремальных условиях, ваше приложение совершенно не реагирует на прикосновения или другие события во время этой длительной операции, и вы не можете предоставить пользователю обратную связь относительно хода этой операции.

Сторожевой таймер убьет приложение, которое блокирует основной поток в течение очень длительного периода времени, что делает приложение не реагирующим на ввод (я полагаю, что эта длительность в настоящее время составляет 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 есть некоторые исключения, но в целом это хорошая практика).

Я также настоятельно рекомендую добавить некоторую визуальную индикацию состояния этой длительной задачи по мере ее выполнения. Ваши пользователи по достоинству оценят это, и оно заставит ваше приложение появиться быстрее, даже если оно может работать в течение той же продолжительности.

0 голосов
/ 16 декабря 2011

Можете ли вы время от времени поражать сторожевого пса во время процесса?Сторожевые таймеры просто для того, чтобы определить, не произошло ли что-нибудь.Они на самом деле не обеспокоены тем, что система занята.

Может ли телефон по-прежнему реагировать на действия пользователя, такие как нажатие кнопки «Домой» во время процесса? с использованием фонового потока

...