Solicitud no enviada

Tengo un problema extraño cuando consumo mi API de mi aplicación. A veces, sin razón, la request simplemente no se envía, y falla al final del time de espera con el siguiente error:

Error Domain=NSURLErrorDomain Code=-1001 "The request timed out." 

He intentado muchas API como NSURLConnection delegates, NSURLSession y NSURLConnection.sendSynchronousRequest sin éxito.

Aquí hay un ejemplo de proyecto que he hecho para resaltar el problema. ConnectionBugApp

Estos son los pasos para reproducir:

  • Ejecute la aplicación en Xcode y detenga la debugging solo para que la aplicación esté en su teléfono
  • Abra la aplicación, click Probar connection (se realiza correctamente, la rueda de carga deja de girar justo después)
  • Ve a otras aplicaciones como Facebook / Twitter / juegos de networking (somes que son un poco pesados) y cambia al modo avión unas cuantas veces
  • Regrese a mi aplicación y click Probar connection (la rueda de carga nunca se detiene)

Algunos detalles que pueden ayudar:

  • Si utilizo mi IP de server en lugar de mi nombre de dominio, tiene éxito

  • El problema solo aparece cuando está en la networking LTE / 4G

Cualquier idea o solución sería muy apreciada. Siéntase libre de pedir más detalles.

Gracias

EDITAR

He editado mucho la descripción desde que la publiqué por primera vez (con la esperanza de que sea más clara y clara), lo siento si algunas respuestas o comentarios ya no tienen sentido.

Me he encontrado con este problema al usar una request asincrónica. Parece que iOS limita el número de conexiones abiertas a un solo dominio, de modo que todas las conexiones posteriores fallan de la manera que usted ha descrito.

Si las conexiones normalmente se completan rápidamente, esto posiblemente no sea un problema.

La solución es limitar el número de conexiones abiertas al mismo dominio para evitar que esto suceda.

La respuesta publicada por karlos funciona porque la synchronization de la connection impide que otros se abran.

Como se mencionó en los comentarios, tuve DNSSEC (protección contra el envenenamiento del caching) habilitado en mi service de alojamiento.

Si lo deshabilita, solucionó el problema, a pesar de que podría no ser una buena solución. Después de algunas semanas de búsqueda, eso será suficiente.

Le daré la recompensa a alguien que pueda explicarlo, o quién puede proporcionar una solución mejor.

En su código, su request tiene un time de espera pnetworkingeterminado de 60 segundos, pero puede cambiar Solicitar time de espera en su código como se muestra a continuación.

en su class NetworkItem cambian el time de espera.

 init(request:NSMutableURLRequest){ self.request = request self.request.timeoutInterval = 120 super.init() } 

Pruebe el siguiente código para la connection. Esto lo ayudaría.

  let urlData = NSURLConnection.sendSynchronousRequest(request, returningResponse: &response, error: &error) if error != nil || urlData!.length == 0 { println("Error happend timeout======\(error?.code)!") continue } else //else1 {if let httpResponse = response as? NSHTTPURLResponse { println("Status Code for successful---\(httpResponse.statusCode)") // For example 502 is for Bad Gateway if (httpResponse.statusCode == 502) { // Check the response code from your server and break break } else { //Your code } } } 

Puede get la list de códigos de estado HTTPS en el siguiente enlace StatusCode