Какова последовательность обновления данных об осложнениях для Apple Watch?

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

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

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

struct data = {
var name: String
var startString: String
var startDate: NSDate
}

Следующий массив является контейнером для этих данных.

var dataArray = [data]

Это позволяет показать сложность, когда часы заблокированы.

func getPrivacyBehaviorForComplication(complication: CLKComplication, withHandler handler: (CLKComplicationPrivacyBehavior) -> Void) {
    handler(.ShowOnLockScreen)
}

Это позволяет продвигаться во времени на сложность.

func getSupportedTimeTravelDirectionsForComplication(complication: CLKComplication, withHandler handler: (CLKComplicationTimeTravelDirections) -> Void) {
    handler([.Forward])
}

Здесь я установил время начала временной шкалы равным текущему.

func getTimelineStartDateForComplication(complication: CLKComplication, withHandler handler: (NSDate?) -> Void) {
    handler(NSDate())
}

Здесь я установил время окончания временной шкалы равным 12 часам.

func getTimelineEndDateForComplication(complication: CLKComplication, withHandler handler: (NSDate?) -> Void) {
    handler(NSDate(timeIntervalSinceNow: (60 * 60 * 12)))
}

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

func getPlaceholderTemplateForComplication(complication: CLKComplication, withHandler handler: (CLKComplicationTemplate?) -> Void) {

    let headerTextProvider = CLKSimpleTextProvider(text: "Some Data")
    let body1TextProvider = CLKSimpleTextProvider(text: "Some Data Time")
    let template = CLKComplicationTemplateModularLargeStandardBody()
    template.headerTextProvider = headerTextProvider
    template.body1TextProvider = body1TextProvider

    handler(template)
}

Это создает самую первую запись временной шкалы для осложнения. Как только усложнение разрешено, этот код будет запущен и сразу же заполняет сложность соответствующим образом.

func getCurrentTimelineEntryForComplication(complication: CLKComplication, withHandler handler: (CLKComplicationTimelineEntry?) -> Void) {

    createData()

    if complication.family == .ModularLarge {

        if dataArray.count != 0 {

            let firstData = dataArray[0]
            let headerTextProvider = CLKSimpleTextProvider(text: firstData.name)
            let body1TextProvider = CLKSimpleTextProvider(text: firstData.startString)
            let template = CLKComplicationTemplateModularLargeStandardBody()
            template.headerTextProvider = headerTextProvider
            template.body1TextProvider = body1TextProvider
            let timelineEntry = CLKComplicationTimelineEntry(date: NSDate(), complicationTemplate: template)
            handler(timelineEntry)
        } else {
            let headerTextProvider = CLKSimpleTextProvider(text: "No Data")
            let body1TextProvider = CLKSimpleTextProvider(text: "Create some data")
            let template = CLKComplicationTemplateModularLargeStandardBody()
            template.headerTextProvider = headerTextProvider
            template.body1TextProvider = body1TextProvider

            let timelineEntry = CLKComplicationTimelineEntry(date: NSDate(), complicationTemplate: template)
            handler(timelineEntry)
        }

    } else {
        handler(nil)
    }

}

Здесь я создаю записи временной шкалы для всех данных, которые у меня есть в настоящее время.

func getTimelineEntriesForComplication(complication: CLKComplication, afterDate date: NSDate, limit: Int, withHandler handler: ([CLKComplicationTimelineEntry]?) -> Void) {

    createData()

    var entries = [CLKComplicationTimelineEntry]()

    for dataObject in dataArray {

        if entries.count < limit && data.startDate.timeIntervalSinceDate(date) > 0 {

            let headerTextProvider = CLKSimpleTextProvider(text: dataObject.name)
            let body1TextProvider = CLKSimpleTextProvider(text: dataObject.startString)
            let template = CLKComplicationTemplateModularLargeStandardBody()
            template.headerTextProvider = headerTextProvider
            template.body1TextProvider = body1TextProvider
            let timelineEntry = CLKComplicationTimelineEntry(date: NSDate(timeInterval: (-10*60), sinceDate: data.startDate), complicationTemplate: template)
            entries.append(timelineEntry)

        }

    }

    handler(entries)

}

Это говорит часы, когда обновить данные усложнения.

func getNextRequestedUpdateDateWithHandler(handler: (NSDate?) -> Void) {
    handler(NSDate(timeIntervalSinceNow: 60 * 60 * 6))
}

Здесь я сталкиваюсь с проблемами.

Как мне создать мои новые данные и перезагрузить график? Какой поток? Я не пытаюсь продлить срок, а скорее полностью заменить его. Я в полной растерянности.Документы Apple довольно расплывчаты, когда дело доходит до этого момента. Я знаю, что мне нужно реализовать следующие методы, но я не знаю как. Может ли кто-нибудь помочь мне заполнить этот код?

func requestedUpdateDidBegin() {
    createData() //I assume createData() goes here? If so, how do I populate the new timeline entries based on the results?
}

func requestedUpdateBudgetExhausted() {
    //This can't possibly be the case as I haven't gotten it to work once.
}

func reloadTimelineForComplication(complication: CLKComplication!) {
      //This method appears to do nothing.
}

Обновить:

Благодаря El Tea, у меня все работает. Мне нужно добавить экземпляр CLKComplicationServer в requiredUpdateDidBegin и поместить метод reloadTimeline внутрь.

Вот обновленный код:

func requestedUpdateDidBegin() {
    print("Complication update is starting")

    createData()

    let server=CLKComplicationServer.sharedInstance()

    for comp in (server.activeComplications) {
        server.reloadTimelineForComplication(comp)
        print("Timeline has been reloaded!")
    }

}

func requestedUpdateBudgetExhausted() {
    print("Budget exhausted")
}

Ответы на вопрос(1)

Ваш ответ на вопрос