Swift на Apple Watch: reloadTimeline(для усложнения) замораживает пользовательский интерфейс

#swift #swiftui #apple-watch #apple-watch-complication #dispatch-queue

Вопрос:

Я использую приведенный ниже метод в своем приложении watchOS всякий раз, когда данные меняются, что должно быть отражено в усложнении. Проблема в том, что выполнение этого метода заставляет мой пользовательский интерфейс зависать на несколько секунд. Если я удалю reloadTimeline вызов, проблема исчезнет. Сначала я подумал, что проблема в том, что это выполняется в основном потоке, но проблема остается при выполнении работы в фоновом потоке ( DispatchQueue.global().async {} или DispatchQueue.global(qos: .background).async {} ). Может быть, это потому, что работа откладывается на основной поток, несмотря ни на что.

Как я могу выполнить этот метод без замораживания пользовательского интерфейса?

Это, кстати, точно такой же обрезанный код, представленный на https://developer.apple.com/wwdc20/10049.

 import ClockKit

enum ComplicationUpdater {

    static func updateActiveComplications() {
        let complicationServer = CLKComplicationServer.sharedInstance()

        if let activeComplications = complicationServer.activeComplications {

            for complication in activeComplications {

                complicationServer.reloadTimeline(for: complication)

            }
        }
    }
}
 

Комментарии:

1. Мое решение на данный момент состоит в том, чтобы вызывать этот метод только тогда, когда приложение переходит в фоновый режим. Это обновляет сложность, когда пользователь нажимает на заводную головку, и обновление немедленно отражается на циферблате часов. Но если я решу снова использовать приложение в течение примерно 10 секунд, я получу блокировку/задержку.