Cómo implementar correctamente la transferencia de configuraciones desde la aplicación iOS a la complicación watchOS2

Lo que quiero lograr es lo siguiente:

Las complicaciones se actualizan en segundo plano a intervalos de 30 minutosLas complicaciones se actualizan cada vez que la aplicación de reloj se ejecuta y recibe sus propios datos actualizadosLas complicaciones se actualizan cada vez que se ejecuta la aplicación iOS y el usuario cambia una configuración que afecta los datos del reloj (como cambiar la ubicación de las observaciones meteorológicas o las unidades de visualización)

Los puntos 1. y 2. parecen ser sencillos, y están bien tratados aquí:¿Cuál es el flujo para actualizar los datos de complicaciones para Apple Watch?

Sin embargo, para el elemento 3, en la aplicación iOS, configuré una instancia de WCSession y llamé a transferCurrentComplicationUserInfo, enviando la nueva configuración como NSDictionary. En la extensión del reloj, esto invoca didReceiveUserInfo en WCSessionDelegate.

- (void)session:(WCSession *)session didReceiveUserInfo:(NSDictionary<NSString *,id> *)userInfo {
    // Code here to apply the new settings
    // ....
    // Invoke a NSUSRLSession-based web query to get new data
    [self queryForNewDataWithCompletionHandler:^(NCUpdateResult result) {
        if (result == NCUpdateResultNewData) {
            // Have new data from web to display
            CLKComplicationServer *server = [CLKComplicationServer sharedInstance];
            for (CLKComplication *complication in server.activeComplications) {
                [server reloadTimelineForComplication:complication];
            }
        }
        // Set date for next complication update to 30 mins from now
        // ...
    }];
}

El problema que tengo es que watchOS está llamando a requestUpdateDidBegin en un hilo separado, poco después de invocar didReceiveUserInfo y esto comienza a ejecutarse ANTES de que tenga la oportunidad de obtener datos actualizados utilizando la nueva configuración en el diccionario UserInfo recién recibido de la aplicación.

En consecuencia, las complicaciones se actualizan dos veces seguidas, una vez que WatchOS llamó a requestUpdateDidBegin, que simplemente actualiza la complicación con los datos existentes (obsoletos), antes de que reciba muy pronto nuevos datos de la web y luego tenga que actualizarlos. de nuevo en mi propio código.

Esto parece innecesario y una pérdida de recursos, sin mencionar el limitado presupuesto de actualizaciones que Apple permite (supuestamente 2 por hora).

¿Estoy haciendo algo mal aquí? ¿Cómo puedo evitar que watchOS2 llame a requestUpdateDidBegin antes de tener la oportunidad de adquirir nuevos datos de la web?

Respuestas a la pregunta(1)

Su respuesta a la pregunta