Colección de citas famosas - Slogan de motivación - Para el desarrollo de iOS, ¿cómo configurar el tiempo de espera posterior a la solicitud asincrónica?

Para el desarrollo de iOS, ¿cómo configurar el tiempo de espera posterior a la solicitud asincrónica?

Si usa AFNetworking-?(NSMutableURLRequest?*)requestWithMethod:(NSString?*)method?path:(NSString?*)path?parameters:(NSDictionary?*)parameters

//Método agregando

[request?setTimeoutInterval:10.0];

Si es?ASIHTTPRequest[request?setNumberOfTimesToRetryOnTimeout:2]

NSMutableURLRequest It; es una subclase de NSURLRequest Los métodos comúnmente utilizados incluyen

Establecer el tiempo de espera de la solicitud (si excede este tiempo, expirará y la solicitud falla) NSMutableURLRequest?*urlRequest?=?[[NSMutableURLRequestalloc] ?initWithURL:url?cachePolicy:NSURLRequestUseProtocolCachePolicytimeoutInterval :10];?NSURLConnection?*_connection?=?[[NSURLConnectionalloc]?initWithRequest:urlRequest?delegate:selfstartImmediately:YES];

Se utiliza uno para crear la solicitud y el otro se utiliza para enviar la solicitud. Luego implementamos varias funciones de devolución de llamada de NSUrlConnectionDelegate para completar todo el proceso.

Generalmente, al enviar solicitudes de red, se establecerá un tiempo de espera para evitar que la solicitud espere allí. Según los diferentes escenarios, también debemos establecer diferentes tiempos de espera. En el código anterior establecemos un tiempo de espera de 10 segundos.

La historia anterior parece perfecta. Pero los desarrolladores de Apple nos cavaron un hoyo aquí.

Si su solicitud es una simple solicitud "Obtener" o una solicitud "publicar" sin cuerpo. Todo funciona perfectamente y la solicitud caduca automáticamente según el tiempo que establezcamos. Pero si envía una solicitud "POST" y [urlRequest setHTTPBody:httpBody]; lo siento, lo han engañado.

Después de ios3.0, el SDK de Apple ha realizado ajustes a esta situación. Si se trata de una solicitud de publicación y se establece httpBody, el tiempo de espera de la solicitud se establece en 240 segundos de forma predeterminada. Incluso si usa [urlRequest?setTimeoutInterval:10] nuevamente, no será válido. Podemos leer este valor una vez completada la configuración y encontrar que no cambiará a 10, pero aún permanecerá 240 segundos. Por lo tanto, cuando la red es inestable, su programa puede quedarse atascado en una larga espera.

Después de descubrir este problema. Controlamos el tiempo de espera configurando el temporizador nosotros mismos. No entraré en detalles aquí sobre cómo hacerlo. Hablemos simplemente de nuestra estrategia.

Dividimos todo el proceso de la red en 4 etapas: establecimiento del enlace, envío de datos, finalización del envío de datos, espera de devolución del paquete y recepción de datos para controlar el tiempo de espera específico.

Establezca nuestro tiempo de espera estándar en N (el valor predeterminado del sistema es 10 segundos, el módulo de red expone las interfaces relevantes, la persona que llama puede configurarlo libremente)

Tiempo de espera del enlace de establecimiento de enlace: N * 1,5

Tiempo de espera para enviar cada paquete de datos: N * 1,5

Tiempo de espera para devolver el paquete una vez completado el envío de datos: N * 2

Tiempo de espera para recibir cada paquete de datos : N * 1

Los tiempos de espera anteriores se pueden controlar con mayor precisión estableciendo configuraciones relevantes en cada etapa de devolución de llamada de ?NSUrlConnectionDelegate.

Explicación especial de por qué el tiempo de espera para esperar un paquete de retorno después de enviar los datos es relativamente largo. Porque durante la prueba real, se descubrió que pasa mucho tiempo desde que se envía el paquete hasta que se recibe el primer paquete de datos. Generalmente, cuanto más grande es el cuerpo http, más obvio es. El módulo de red está enviando datos en el búfer de datos, por lo que aquí se realizan controles especiales.

Parte del contenido proviene del blog "Tiempo de espera de red NSURLCONNECTION". 》