Основная проблема заключается в том, что вы пытаетесь сделать асинхронный вызов в своем контроллере сложности.
Код, следующий за вашим вызовом sendMessage:
, будет выполнен еще до того, как ваш обработчик ответа получит ответ. Вот почему ваше усложнение показывает «нет», так как текст шаблона был установлен до того, как вы получили ответ.
Некоторое время спустя, после того как getCurrentTimelineEntryForComplication
вернется, sendMessage
получит ответ и вызовет обработчик ответа, который просто установит respondedString
, а затем выйдет из этого блока.
Чего вам следует избегать:
Вам следует рассмотреть рекомендации Apple и не пытаться получить какие-либо данные в контроллере сложности.
Задача вашего класса источника данных — как можно быстрее предоставить ClockKit любые запрошенные данные. Реализации ваших методов источника данных должны быть минимальными. Не используйте методы источника данных для извлечения данных из сети, вычисления значений или выполнения каких-либо действий, которые могут задержать доставку этих данных. Если вам нужно получить или вычислить данные для вашего усложнения, сделайте это в своем приложении iOS или в других частях вашего расширения WatchKit и кэшируйте данные в месте, где ваш источник данных усложнения может получить к ним доступ. Единственное, что должны делать ваши методы источника данных, — это брать кэшированные данные и помещать их в формат, требуемый ClockKit.
Кроме того, любая деятельность, которую вы выполняете в своем источнике данных, будет напрасно расходовать ежедневный бюджет времени выполнения, выделенный для вашего усложнения.
Как вы можете предоставить данные для вашего осложнения?
Apple предоставляет метод Watch Connectivity transferCurrentComplicationUserInfo
, который немедленно передает (словарь) информацию об осложнениях с телефона на часы.
Когда ваше приложение для iOS получает обновленные данные, предназначенные для вашего усложнения, оно может использовать платформу Watch Connectivity для немедленного обновления вашего усложнения. Метод transferCurrentComplicationUserInfo: WCSession отправляет сообщение с высоким приоритетом вашему расширению WatchKit, пробуждая его по мере необходимости для доставки данных. После получения данных расширьте или перезагрузите свою временную шкалу по мере необходимости, чтобы заставить ClockKit запросить новые данные из вашего источника данных.
На стороне часов у вас есть WCSessionDelegate
дескриптор didReceiveUserInfo
, и вы используете полученные данные для обновления своего усложнения:
func session(session: WCSession, didReceiveUserInfo userInfo: [String : AnyObject]) {
if let ... { // Retrieve values from dictionary
// Update complication
let complicationServer = CLKComplicationServer.sharedInstance()
guard let activeComplications = complicationServer.activeComplications else { // watchOS 2.2
return
}
for complication in activeComplications {
complicationServer.reloadTimelineForComplication(complication)
}
}
}
Инженеры Apple обычно рекомендуют настроить диспетчер данных для хранения данных. В контроллере усложнения вы должны получать самую последнюю информацию из диспетчера данных, чтобы использовать ее для своей временной шкалы.
На GitHub есть несколько проектов, использующих этот подход.
Если вы по-прежнему предпочитаете запрашивать данные со стороны наблюдения:
Вы хотели бы переместить свой код WCSession
из контроллера усложнения в расширение watch и активировать его как часть WKExtension
init.
Суть в том, чтобы обработчик ответов вручную обновлял сложность после получения данных.
Когда вызывается обработчик ответа вашего делегата сеанса, вы можете использовать код обновления усложнения, который я предоставил ранее, чтобы перезагрузить временную шкалу вашего усложнения.
Если вы используете запланированные обновления осложнений, недостатком этого конкретного подхода является то, что вы будете выполнять два обновления. Первое обновление инициирует запрос данных, но не содержит новых данных для использования. Второе обновление (вручную) происходит после получения данных, когда новые данные появляются на временной шкале.
Вот почему подход с предоставлением данных в фоновом режиме с телефона работает лучше, так как требует только одного обновления.
person
Community
schedule
26.04.2016
AppDelegate
вместо контроллера представления. Вы всегда хотите активировать его как можно скорее (и сделать его доступным для всего приложения). - person   schedule 26.04.2016