Ivars расширения Today постоянно сбрасываются?

Я пишу код для нового виджета «Сегодня» в iOS 8, но заметил, что каждый раз, когда вызывается widgetPerformUpdateWithCompletionHandler:, мои авары (созданные из @property) сбрасываются. Это похоже на каждый раз, когда создается экземпляр нового контроллера представления.

Это делает невозможным сохранение данных о памяти между обновлениями виджета (пока он находится в фоне, например, и вызывается для обновления своего содержимого).

Это нормальное поведение или баг? Должен ли я сохранять свои простые числа в NSUserDefaults вместо того, чтобы полагаться на данные из памяти, которые сбрасываются?


person sidyll    schedule 09.10.2014    source источник
comment
Я не изучал это слишком тщательно, но я понимаю, что время жизни расширений как живых процессов чрезвычайно короткое — не больше, чем абсолютно необходимо для выполнения их единственной задачи. См., например, Схема жизненного цикла в документации.   -  person jscs    schedule 09.10.2014
comment
Спасибо @JoshCaswell. Я видел этот раздел, но хотя это имеет смысл для различных типов расширений, мне кажется странным, что жизненный цикл виджета заканчивается, когда панель закрывается (похоже, так и происходит). Если каждый раз, когда панель открывается, создается новый виджет, то мне нужно снова изучить цель этого метода.   -  person sidyll    schedule 09.10.2014
comment
Ваше расширение не будет работать между вызовами widgetPerformUpdateWithCompletionHandler:. Этот метод вызывается, когда iOS запускает ваше расширение в фоновом режиме, чтобы вы могли получить новые данные. Затем ОС захватывает изображение вашего расширения (для этого предназначен обработчик завершения), чтобы показать его как своего рода экран запуска для вашего расширения (когда запускается центр уведомлений, ваше расширение недоступно сразу, поэтому он показывает изображение, пока оно есть). Скорее всего, вы захотите использовать NSUserDefaults для хранения кэшированных данных для загрузки в ожидании поступления обновленных данных с сервера.   -  person Andrew    schedule 09.10.2014
comment
Другими словами, ОС будет периодически запускать ваше приложение, чтобы вы могли получать новые данные, чтобы пользователь всегда видел обновленные данные в центре уведомлений. Вы должны кэшировать эти данные в этом методе, чтобы вы могли быстрее загружать расширение, когда оно запускается для центра уведомлений. Все это обсуждается здесь   -  person Andrew    schedule 09.10.2014
comment
@SantaClaus, не могли бы вы опубликовать эти комментарии в качестве ответа? Это именно та информация, которую я искал. Спасибо   -  person sidyll    schedule 09.10.2014


Ответы (1)


Ваше расширение не будет работать между вызовами widgetPerformUpdateWithCompletionHandler:. Этот метод вызывается, когда iOS запускает ваше расширение в фоновом режиме, чтобы вы могли получить новые данные. Затем ОС захватывает изображение вашего расширения (для этого предназначен обработчик завершения), чтобы показать его как своего рода «экран запуска» для вашего расширения (когда запускается центр уведомлений, ваше расширение недоступно сразу поэтому он показывает изображение, пока оно есть). Вероятно, вы захотите использовать NSUserDefaults (или другой метод) для хранения кэшированных данных для загрузки в ожидании поступления обновленных данных с сервера.

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

person Andrew    schedule 09.10.2014
comment
Не совсем точно. Ваше расширение может продолжать работать между вызовами widgetPerformUpdateWithCompletionHandler:. Причина, по которой переменные сбрасываются, заключается в том, что UIViewController (ну, опять же, может — поведение меняется в зависимости от системных условий) повторно создается. По сути, не думайте, что вызовы инициализации вашего основного VC будут сопровождаться запуском вашего расширения. Они могут быть 1-к-1, вы можете создавать экземпляры несколько раз при запуске. Расширение может умереть, когда Центр уведомлений исчезнет, ​​а может и нет. - person John Scalo; 30.10.2014