2011-03-04 10 views
7

Estoy usando una instancia de NSURLConnection en el iPhone para solicitar datos de un servidor, administrado por un delegado como de costumbre. Las solicitudes son bastante frecuentes (tal vez una vez cada 2 minutos, por ejemplo) y tienen una URL común y fija. En lugar de ver la buena instancia de NSURLConnection ser liberado después de cada descarga y luego uno nuevo que se está creando:Reutilizando una instancia de NSURLConnection

  1. ¿Hay alguna pena en la retención de la primera conexión y volver a utilizarlo? (Espero que sí, una buena autenticación debería valer miles.)

  2. Si es así, ¿cómo lo vuelvo a utilizar? El método destacado en los documentos es -start, pero parece que bloquea la aplicación cuando se invoca en una instancia ya utilizada (y no nula) de NSURLConnection. [Los documentos de hacer decir -start "hace que el receptor para iniciar la carga de datos, si no lo ha hecho"]

En caso de que sea de ayuda con respecto a las preguntas anteriores, estoy (estaba!) Propone lo siguiente:

if (connection_ == nil) 
    { 
    connection_ = [NSURLConnection connectionWithRequest:request 
               delegate:self]; 
    } 
    else 
    { 
    [connection_ start]; 
    } 
+0

Pregunta interesante ... :) – Jasarien

+0

Este es un pequeño duplicado, ver http://stackoverflow.com/questions/886810/nsurlconnection-is-run- many-times. Sin embargo, todavía no hay una buena respuesta. Parece que necesitas inventar tu propia clase para esta tarea. – SK9

+0

Parece que una de las respuestas a esa pregunta es sugerir una transmisión HTTP en lugar de una conexión de uso único. Mantener una secuencia abierta y usarla solo cada 2 minutos no sería una gran idea. Realmente no veo un problema para liberar y volver a crear el objeto de conexión. ¿No es esto una preoptimización? – Jasarien

Respuesta

3

los documentos parece decir que la conexión URL conserva su delegado (no convencional, pero necesario en este caso) y luego lo libera cuando la conexión termina de cargar, falla o se cancela.

El problema es que el delegado no es una propiedad configurable en NSURLConnection y, por lo tanto, no puede restablecerlo después de su lanzamiento. Esto prácticamente hace que la conexión de URL sea inútil después de que se haya ejecutado una vez, lo que requiere que lo libere y vuelva a crear si desea volver a hacerlo.

+0

@J: Esto también lo reuní. No sé sobre alternativas a NSURLConnection aquí, tal vez ASI [http://allseeing-i.com/ASIHTTPRequest/] etc.? – SK9

+0

No he usado 'AIHTTPRequest', pero creo que está basado en' NSURLConnection' así que incluso si puede reutilizar una instancia de uno de ellos, todavía estaría liberando y recreando la conexión de URL debajo del capó. – Jasarien

+0

@J: ¿Es posible crear un NSURLConnection autenticado antes de tiempo y retrasar la realización de la solicitud? (es decir, cargue la pistola, dispare cuando esté lista). – SK9