2014-10-23 1 views
10

В соответствии с документацией Apple «Чтобы помочь вашему виджету выглядеть в актуальном состоянии, система иногда захватывает моментальные снимки вашего виджетов. Когда виджет становится видимым снова, отображается самый последний моментальный снимок до тех пор, пока система заменяет его живой версией представления ».Сегодня во время перерисовки отображается вид расширения.

То, что я вижу, однако, заключается в том, что моментальный снимок удаляется с экрана до того, как готовится живой просмотр. Это приводит к эффекту вспышки, когда старый снимок снимается с экрана, вид пуст в течение секунды секунды, затем появляется новое представление.

Является ли разработчик ответственным за переход между моментальным снимком и живым представлением? Если да, то какова стратегия для этого? Я не вижу никакого способа напрямую контролировать этот переход.

я был в состоянии смягчить эффект значительно перемещая загрузку данных в widgetPerformUpdateWithCompletionHandler: и сохраняя рисунок в viewWillAppear :, но я до сих пор вижу вспышки раз в 15 (или около того) откроется в Центре уведомлений.

ответ

20

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

Из документации я думал, что представление сегодняшнего дня будет содержать «моментальный снимок» моего состояния виджетов до тех пор, пока не будет успешно обработан обработчик завершения widgetPerformUpdateWithCompletionHandler.

Это, похоже, не так. Из того, что я вижу, «моментальный снимок» используется только тогда, когда анимация Today View анимируется (когда пользователь отключает центр уведомлений). Как только сегодняшнее представление загружено и неподвижно, ваш виджет загружается с нуля (завышен от xib при использовании) и вызывается viewDidLoad. На данный момент вы должны заполнить свой виджет кэшированными данными (не из веб-запроса). Если вы этого не сделаете, вы увидите временные данные из вашего наконечника. Это и вызывает мигание.

Когда viewDidLoad завершено widgetPerformUpdateWithCompletionHandler, который позволяет вам получать свежие данные. При получении новых данных вы должны вызывать обработчик завершения и кэшировать данные, которые он может использовать, когда виджет загружается позже с нуля (в viewDidLoad).

Простым способом кэширования данных является пользовательское значение по умолчанию.

+0

Ну, ваше непонимание «моментального снимка» в точности эквивалентно моему непониманию моментального снимка. Спасибо за ваши исследования и материалы. Я дам ему выстрел и дам вам знать, разрешит ли он мою проблему со вспышкой (я подозреваю, что так будет, учитывая то, что вы описали). – christopherdrum

+0

Отлично. Дайте мне знать, если это решит вашу проблему :) – bencallis

+0

@christopherdrum Это работало для вас? Если это так, не забудьте отметить его как правильный ответ, чтобы помочь другим :) – bencallis

2

Вы должны быть осторожны обработчика компиляции в

- (Недействительными) widgetPerformUpdateWithCompletionHandler: (вакуум (^) (NCUpdateResult)) completionHandler

метод. Случается, что у вашего расширения, вероятно, есть ошибка, и каждый раз просмотр появляется, когда он вызывается снова. Попробуйте подключить расширение к отладчику (Debugger-> Attach to Process-> your extension id) и посмотреть результат, поставив некоторые точки останова.

+0

Да, я провел обширную регистрацию и отслеживание останова по этой проблеме. Если я поставлю точку останова в самом начале widgetPerformUpdateWithCompletionHandler: и подождите немного, содержимое виджета полностью исчезнет. Это до любой загрузки данных или макета пользовательского интерфейса или чего-то еще. Верно, что widgetPerformUpdateWithCompletionHandler: вызывается каждый раз, когда отображается представление, но это похоже на документацию 8.1. Неясно, какие методы контроллера вида вызывают в каком порядке и в какое время для виджетов. Они не ведут себя как обычные контроллеры. – christopherdrum

+0

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

+0

Ну, я ничего не вижу в журналах сбоев. Но я продолжу с вашим советом и посмотрю, есть ли еще какая-то ошибка, которую мы еще не обнаружили. – christopherdrum