¿Cuál es el flujo para actualizar los datos de complicaciones para Apple Watch?

He estado siguiendo muchos tutoriales en Internet para aprender cómo configurar la complicación. No tengo problemas para configurar la complicación como se esperaba.

Hasta que caduquen las entradas iniciales de la línea de tiempo. Después de 12 horas, no sé cómo actualizarlo para mantener viva la complicación. Compartiré todo lo que tengo a continuación y espero que alguien pueda ayudarme a completarlo.

Aquí, creo las variables para mis datos que quiero mostrar en la complicación.

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

La siguiente matriz es un contenedor para estos datos.

var dataArray = [data]

Esto permite que se muestre la complicación cuando el reloj está bloqueado.

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

Esto permite avanzar en el tiempo en la complicación.

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

Aquí, configuro el tiempo de inicio de la línea de tiempo para que sea igual a ahora.

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

Aquí, configuro el tiempo de finalización de la línea de tiempo para que sea igual a 12 horas a partir de ahora.

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

Aquí, creo la plantilla de la complicación. Esto es para mostrar datos de muestra para los usuarios cuando ven mi complicación mientras examinan todas las complicaciones en su reloj.

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)
}

Esto crea la primera entrada en la línea de tiempo para la complicación. Tan pronto como se habilite la complicación, este código se ejecutará e inmediatamente completará la complicación en consecuencia.

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)
    }

}

Aquí es donde creo entradas de línea de tiempo para todos los datos que tengo actualmente.

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)

}

Esto le dice al reloj cuándo actualizar los datos de complicación.

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

Aquí es donde me encuentro con problemas.

¿Cómo creo mis nuevos datos y vuelvo a cargar la línea de tiempo? ¿Cuál es el flujo? No estoy tratando de extender la línea de tiempo, sino más bien reemplazarla por completo. Estoy completamente perdido.Documentos de Apple son bastante vagos cuando se trata de este punto. Sé que necesito implementar los siguientes métodos, pero no sé cómo. ¿Alguien puede ayudarme a completar este código?

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.
}

Actualizar:

Gracias a El Tea, lo tengo funcionando. Necesito agregar una instancia de CLKComplicationServer a requestUpdateDidBegin y poner el método reloadTimeline dentro.

Aquí está el código actualizado:

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")
}

Respuestas a la pregunta(2)

Su respuesta a la pregunta