2013-08-18 2 views
0

Я хочу отменить длительный метод расчета и отклонить ViewController, когда приложение отправлено на задний план.iOS cancel (void) -выполнение и отклонение ViewController

Подробности: После нажатия кнопки в MainViewController отображается новый ResultViewController, и в методе ViewDidLoad запускается длинный метод расчета. Метод расчета работает на основном потоке, который полностью прекрасен.

Для случая, когда приложение подходит к фону, я хочу предотвратить, что приложение будет убито из-за не законченного метода расчета. Я установил уведомление applicationatinDidEnterBackground, которое может быть использовано в ResultViewController, но я не знаю, как отменить текущий метод расчета и отклонить ResultViewController.

Спасибо.

ответ

3

и методы расчета долго работает запускаются в методе ViewDidLoad. Метод расчета работает на основном потоке, который полностью прекрасен.

Честность, я сомневаюсь, что это может быть обозначено как «отлично».

Правильным решением было бы переместить эти вычисления в фоновый поток и выполнить их асинхронно.

Если вы блокируете основной поток слишком долго (как в этом случае), то вы даже не узнаете, что приложение будет помещено в фоновом режиме - уведомление об этом не будет обрабатываться основной очередью приложения, поскольку вы потребляете все свои ресурсы. Watchdog просто убьет ваше приложение, так как оно не может обработать уведомление applicatinDidEnterBackground в течение разумного промежутка времени (приблизительно 7-8 секунд).


Edit (в ответ на вопрос в комментарии)

Вы можете проверить, как реализовать NSOperation и как использовать NSOperationQueue. Хорошим ресурсом для этого является, например, this site.

То, что я вам говорю, - это общее представление о том, как работает отмена операций, особенно использование свойства isCancelled, которое проверяется в критических разделах работы (и используется для остановки вычислений). Вам не нужно внедрять NSOperation в вашем случае (если вы не хотите - это может быть хорошим упражнением ;-)), но если вы создадите какой-то класс, который обрабатывает данные, и вы добавите в него такой метод, как cancel, то вы можете имитировать NSOperation's поведение в вашем коде.

+0

deekay, спасибо вам ответ. Я не думал об этом факте, что уведомление заблокировано. Я постараюсь изменить это. – JFS

+0

Здравствуйте, Deekay, похоже, вы знаете больше об этом бизнесе. Не могли бы вы дать мне более подробную информацию, чтобы поставить задачу в фоновом режиме, но убейте ее, когда «applicationDidEnterBackground». – JFS

+0

См. Мой обновленный ответ. – deekay