#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 секунд, я получу блокировку/задержку.