GCD dispatch_io API para networkinges en iOS: ¿desalentado?

La documentation de Apple dice que:

En iOS, se desalienta la networking POSIX porque no activa la radio celular o la VPN bajo demanda. Por lo tanto, como regla general, debe separar el código de networking de cualquier funcionalidad de procesamiento de datos común y reescribir el código de networking usando APIs de nivel superior.

Ese documento no menciona las API dispatch_io de GCD, por lo que no está claro si activan la radio en iOS o no. De hecho, no está claro si la "salsa especial" está en el código que abre la connection, o en el código que lee y escribe en ella.

¿Qué sucede si conecto un socket usando la API POSIX y lo paso a dispatch_io_create ? ¿Qué sucede si creo un socket usando la API CFStream, extraigo el descriptor de file y lo paso a dispatch_io_create ? ¿Cuál de esos methods hace que la networking funcione correctamente en iOS? ¿Ambos? ¿Ninguno?

No lo he probado, pero supongo que todas las VPN a pedido y la magia de la radio celular ocurren a la hora de inicio / configuration / connection, porque eso es lo único que realmente tendría sentido. Por lo tanto, espero que su enfoque de desenterrar el descriptor de file con CFSocketGetNative y el uso de dispatch_io funcionen bien, al less hasta que una de las conexiones se rompa (suponiendo TCP / conexiones con estado). AFAICT recuperándose de conexiones rotas no está integrado en CFSocket/CFNetworkStream todos modos, así que probablemente sea de seis a uno …

He leído algunas noticias vagas sobre la nueva implementación TCP multitrayecto que viene a iOS (suena como enlace vinculado revisado), y no está claro si eso está disponible para aplicaciones de terceros o no, pero lo pienso de esta manera: Tanto el soporte de múltiples routes está en la stack de protocolos (y, por lo tanto, se abstrae al desarrollador de la aplicación como un solo socket / descriptor de file) y funcionará de manera transparente para el desarrollador de aplicaciones de terceros en cualquier socket TCP, o depende de un nivel superior componente de usuario de tierra para manejar / agregar las múltiples conexiones subyacentes en una sola, y forzará a los desarrolladores a una API de nivel superior. Ya tiene que usar la API de nivel superior para configurar la connection si desea la VPN a pedido y la funcionalidad de la radio celular, por lo que parecería que no le importaría de ninguna manera.

Si su objective es simplemente tener una session de E / S asíncrona atendida por bloques, parece ser el curso de acción más seguro (dado que esta información parece un poco especificada en los documentos) sería utilizar la API basada en runloop y tener la llamada de callback un bloque. Si le preocupa la interacción entre su E / S de networking y el runloop principal, siempre puede poner en marcha un subprocess de background con su propio runloop y progtwigr su E / S allí. Después de haber hecho I / O con ambas API en el pasado, esperaría que el método runloop sea, en cuanto al performance, funcionalmente equivalente a usar la API dispatch_io en el caso común (es decir, no es notablemente más lento a less que esté haciendo algo realmente alto performance o realmente hablador.)

FWIW, esta pregunta podría tener una mejor oportunidad de get una respuesta autorizada si se publica en el tablero de soporte de desarrolladores de Apple (pero puede que no sea así).