¿Por qué enviar un post desde la extensión de WatchKit a iOS y recibir una respuesta es tan lento?

Estoy usando el método sendMessage para enviar un post desde la extensión de WatchKit a una aplicación de iOS. Se tarda aproximadamente 230 ms en promedio para recibir una respuesta. El time no depende de si la aplicación iOS está en pantalla o se ejecuta en segundo plano. 230 ms es aproximadamente el time que tarda la luz en recorrer la circunferencia y la espalda de la Tierra. Pero el teléfono está sentado a 30 cm de mi reloj cuando estoy probando esto.

Preguntas :

  1. ¿Por qué es tan lento?
  2. ¿Se supone que es tan lento?
  3. ¿Hay alguna forma de hacerlo más rápido?

Una observación: según mis experimentos previos en watchOS 1, la comunicación fue un poco más rápida, una ida y vuelta solía tomar unos 50 ms.

Enviar un post desde la extensión WatchKit

 let session = WCSession.defaultSession() session.sendMessage(["message from watch":"🌷"], replyHandler: { reply in // Getting reply from iOS app here }, errorHandler: nil) 

Recibe el post de la aplicación iOS

 func session(session: WCSession, didReceiveMessage message: [String : AnyObject], replyHandler: ([String : AnyObject]) -> Void) { replyHandler(["reply from iOS":"🐱"]) } 

Aplicación Demo: https://github.com/evgenyneu/WatchKitParentAppBenchmark

iOS: 9.0, watchOS: 2.0

AFAIK, cuando envía un post a otro dispositivo, el post se archivará en un file en el directory local llamado WatchDirectory .

Este directory se sincronizará con otro dispositivo como otras aplicaciones de iCloud Drive o Drop Box a través de bluetooth. Debido a que este enfoque no necesita la aplicación que se ejecuta para iOS y la aplicación watchOS mientras se finaliza la transferencia.

Cuando llegaron los nuevos files al directory, iOS (o watchOS) invocará la API relacionada con WCSession para procesar el contenido. Si es necesario, iOS (o watchOS) despierta la aplicación de destino en segundo plano antes del post de envío.

Con watchOS1, la extensión de reloj se ejecuta en iOS, solo se ejecuta la interfaz de usuario remota en AppleWatch. Entonces, requiere un process mucho más simple para comunicarse, solo comunicación entre processs.

sendMessage es un método mucho más costoso que otras API de comunicación que proporcionan WCSession . iOS no puede usarlo hasta que la aplicación de reloj se ejecuta en primer plano, y el uso de sendMessage de watchOS debería tener que reactivar el iPhone e iniciar la aplicación iOS en segundo plano. Después de que se manejaron los posts enviados, iOS puede eliminar la aplicación de destino que se ejecuta en segundo plano para recuperar la memory.

Entonces, IMO no hay razón para que sea rápido.

En mi caso para actualizar mi UI instantáneamente en el dispositivo:

  func session(session: WCSession, didReceiveMessage message: [String : AnyObject]) { //receive message from watch dispatch_async(dispatch_get_main_queue()) { self.textLabel.text = message["optionSent"]! as? String } }