iOS: что произойдет, если я выполню фоновое задание, а затем покину контроллер представления? - PullRequest
5 голосов
/ 16 февраля 2012

Допустим, у меня есть контроллер вида A и контроллер вида B.

В VC A я нажимаю VC B. Затем в VC B я выполняю некоторые фоновые задачи, используя NSOperation.В фоновых задачах я изменяю переменные VC B.

Что произойдет, если фоновые задачи не завершены, и я выйду из VC B?Будут ли отменены операции или они все еще будут выполняться?При отладке кажется, что они все еще выполняются.В таком случае, не получат ли они доступ к уже освобожденным переменным (так как я вышел из VC B).

Я немного смущен этим, кто-нибудь может мне помочь?:)

Спасибо,

Ответы [ 3 ]

4 голосов
/ 16 февраля 2012

Было бы хорошо рассмотреть цель VC-B против цели фоновых действий.Если существуют фоновые действия для поддержки того, что пользователь видит в VC-B, и когда пользователь уходит из VC-B, фоновые действия больше не актуальны, тогда выход из VC-B должен привести к прекращению фоновых действий.С другой стороны, если фоновые действия имеют цель «больше, чем» VC-B, пользователь будет ожидать их продолжения;в этом случае, вероятно, подходит какой-то «относительно постоянный / долгоживущий» объект («фоновый менеджер») для управления действиями.В последнем случае VC будут взаимодействовать с фоновым менеджером по мере необходимости.

Итак (как и должно быть) все сводится к тому, что вы (и, что более важно, что пользователь) хочет / ожидаете ...

4 голосов
/ 16 февраля 2012

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

Вы заставите ОС выдать исключение при попытке доступа к объекту контроллера представления, который теперь освобожден.Это опасность выполнения фоновых потоковых операций.

Вы должны планировать соответственно, в этом случае, чтобы иметь возможность отменить свою операцию, когда VC B будет освобожден.Это означает создание подкласса NSOperation, реализацию main () и проверку на isCancelled.

См. Документацию Apple относительно NSOperation, NSOperationQueues и параллельного программирования.

1 голос
/ 16 февраля 2012

Из документов:

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

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

Если вы хотите реализовать параллелизм, возможно, вы захотите изучить использование Grand Central Dispatch и блоков. Это будет работать лучше, поскольку блоки инкапсулируют и сохраняют при необходимости любые переменные, на которые вы ссылаетесь внутри блока, намного проще в настройке, выполнении и создании более чистого кода.

...