С усложнением часов и путешествием во времени getTimelineEntriesForComplication часто вызывается (слишком)
Из приведенных ниже данных, ClockKit генерирует будущее CLKComplicationTimelineEntry
предметы один раз, но за прошедшие моменты времени сделано 24 звонка! Почему это?
Больше деталей:
Я заметил странное поведение в моей усложнении Apple Watch.
Он поддерживает Time Travel - я предоставляю данные за 1 день, 4 дня в будущее. В настоящее время я пытаюсь быть хорошим гражданином и меньше звонить, чтобы восстановить мои данные о осложнениях.
Чтобы понять, как часто совершаются определенные звонки, я просто print
внутри обоих getTimelineEntries(for:before:limit:withHandler:)
а также getTimelineEntries(for:after:limit:withHandler:)
который выводит before
/after
параметры.
Когда я запускаю приложение / усложнение в симуляторе, я получаю следующий вывод:
generate future timeline entries (after date:2016-07-23 10:33:31 +0000)
generate past timeline entries (before date:2016-07-23 10:33:31 +0000)
generate past timeline entries (before date:2016-07-23 09:33:31 +0000)
generate past timeline entries (before date:2016-07-23 08:33:31 +0000)
generate past timeline entries (before date:2016-07-23 07:33:31 +0000)
generate past timeline entries (before date:2016-07-23 06:33:31 +0000)
generate past timeline entries (before date:2016-07-23 05:33:31 +0000)
generate past timeline entries (before date:2016-07-23 04:33:31 +0000)
generate past timeline entries (before date:2016-07-23 03:33:31 +0000)
generate past timeline entries (before date:2016-07-23 02:33:31 +0000)
generate past timeline entries (before date:2016-07-23 01:33:31 +0000)
generate past timeline entries (before date:2016-07-23 00:33:31 +0000)
generate past timeline entries (before date:2016-07-22 23:33:31 +0000)
generate past timeline entries (before date:2016-07-22 22:33:31 +0000)
generate past timeline entries (before date:2016-07-22 21:33:31 +0000)
generate past timeline entries (before date:2016-07-22 20:33:31 +0000)
generate past timeline entries (before date:2016-07-22 19:33:31 +0000)
generate past timeline entries (before date:2016-07-22 18:33:31 +0000)
generate past timeline entries (before date:2016-07-22 17:33:31 +0000)
generate past timeline entries (before date:2016-07-22 16:33:31 +0000)
generate past timeline entries (before date:2016-07-22 15:33:31 +0000)
generate past timeline entries (before date:2016-07-22 14:33:31 +0000)
generate past timeline entries (before date:2016-07-22 13:33:31 +0000)
generate past timeline entries (before date:2016-07-22 12:33:31 +0000)
generate past timeline entries (before date:2016-07-22 11:33:31 +0000)
2 ответа
Нет никаких условий, что ваш метод источника данных будет вызываться только один раз. Вы просто должны быть готовы обработать запрос.
Почему он обрабатывает прошлые записи иначе, чем будущие записи?
Я полагаю, что это оптимизация, предназначенная для определения приоритетности будущих записей графика времени (по сравнению с недавними записями прошлого).
Вернувшись в watchOS 2.0.1, сервер усложнения сначала заполнил временную шкалу будущими записями, а затем продолжил заполнять временную шкалу прошлыми записями. Конечно, понятно, как Apple может выбрать пакетирование прошлых записей, чтобы расставить приоритеты для более свежих записей над более отдаленными.
Хотя Apple с тех пор, безусловно, доработала свой код, вполне вероятно, что тот же уровень внимания и детализации по-прежнему будет применяться в текущей версии watchOS.
Что, если для меня это дорогая операция?
Если вам нужно сделать больше, чем просто использовать имеющиеся данные о сложности под рукой, и ваш поиск данных связан с конкретным запросом, который делает система, вы должны реорганизовать этот код, чтобы переместить его за пределы этого метода.
В общем, вы хотите, чтобы у вас уже были предварительно выбранные данные, которые можно просто напрямую превратить в записи временной шкалы.
Это становится гораздо более важным в watchOS 3, когда вы не просто обновляете усложнение, но и обновляете свое приложение в фоновом режиме.Даже если вам по-прежнему требуется поддержка watchOS 2 сейчас, вы должны спроектировать, как извлекаются данные и обновляются сложности, чтобы посмотреть, как watchOS 3 может выполнить обновление всего вашего приложения.
Почему он вызывает мой метод источника данных более одного раза?
Apple использует различные методы для оптимизации работы сервера усложнения (или других частей операционной системы). Все, что вы можете сделать, - это поверить, что система настроена на снижение потребления памяти и энергии, и делает это по уважительной причине.
Это на самом деле было стандартной практикой в течение многих лет, и это обычно наблюдается вUITableViewDataSource
где метод какnumberOfSectionsInTableView
может быть вызван несколько раз.
Как написал другой автор, количество вызовов метода может изменяться в разных версиях ОС.
Что делать, если это ошибка?
Вероятно, он работает как задумано, но если вы считаете, что это ошибка, вы можете создать минимальный пример проекта и отправить его с отчетом об ошибке в Apple.
Несвязанная заметка о путешествии во времени
Я заметил, что вы хотите предложить 4 дня будущих путешествий. Это превысит скользящее окно перемещения во времени.
Ради эффективности, вы можете рассмотретьlatestTimeTravelDate
:
При построении вашей временной шкалы не создавайте никаких записей после этой даты. Это пустая трата времени, потому что эти записи не будут отображаться сразу.
Я почти уверен, что это та же самая проблема, с которой я столкнулся в своем приложении watchOS; Мой код генерировал массив записей временной шкалы, упорядоченных от самых последних к наименьшим последним, когда сервер Complication запрашивает записи в порядке от наименьшего к последнему.
Сервер усложнения, таким образом, делал недействительными все, кроме первой сгенерированной мной записи, и запрашивал дополнительные обновления непосредственно перед этой записью.
Мое исправление должно было изменить мой getTimelineEntries(for:after:limit:withHandler:)
функция от append
вход в insert
по индексу 0.