2012-09-12 10 views
5

Solo en iOS 5, una aplicación en la que estoy trabajando parece eliminar solicitudes cuando envío una gran cantidad de solicitudes de forma asincrónica. Gran significado aún bastante pequeño - probando con 30 en este momento¿Límite al número de solicitudes de NSURLConnection simultáneas en iOS 5?

Cada solicitud usa su propia NSURLConnection y se espera que regrese relativamente rápido (es decir, 300 ms - 2s). También mantenemos una conexión abierta durante un largo período de tiempo.

Parece que cada 5ta conexión no puede salir del dispositivo. Ciertamente nunca llega al servidor, y la depuración de la red con Charles ni siquiera muestra las solicitudes que salen.

Me pregunto si alguien sabe de un límite en el número de objetos NSURLConnection abiertos simultáneamente y solicitudes activas.

Vale la pena señalar que no vemos este problema en iOS 4. También parece que si eliminamos nuestra conexión de larga duración, no dejamos caer cada 5ª solicitud más.

+2

puse mina en NSOperations en un NSOperationsQueue, y con frecuencia emitir varios cientos web obtiene a la vez , y nunca encontré un caso de fallas de conexión. Me doy cuenta de que esto es probablemente un poco diferente de lo que estás haciendo. Probablemente pueda desarrollar una aplicación de prueba que solo obtenga el mismo archivo de una cuenta de Drop Box, y vea cuándo las cosas van mal, pero espero que el número sea bastante grande antes de que el sistema desconecte las conexiones. –

Respuesta

4

NSOperationQueue es la mejor manera de solucionar este problema. En pocas palabras, ajusta su NSURLConnection en un NSBlockOperation, luego agréguelo a la cola. La cola le permite establecer varias propiedades, como la cantidad máxima de conexiones simultáneas, y también le brinda una manera fácil de cancelar operaciones en cola.

Hay una buena introducción a este patrón de diseño en un video de WWDC (2012) llamado "Creación de interfaces de usuario simultáneas en iOS".

En iOS 5 se puede usar la siguiente llamada para iniciar una NSURLConnection y añadirlo a una NSOperationQueue

+ (void)sendAsynchronousRequest:(NSURLRequest *)request queue:(NSOperationQueue *)queue completionHandler:(void (^)(NSURLResponse*, NSData*, NSError*))handler

Cuestiones relacionadas