Pregunta

Estoy usando el código del documento de Apple para hacer algún tipo de comunicación HTTP. Puedo conectar con la URL con éxito, pero no para recibir los datos de mi servidor.

// create the request
NSURLRequest *theRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://..."]
                        cachePolicy:NSURLRequestUseProtocolCachePolicy
                        timeoutInterval:60.0];
// create the connection with the request
// and start loading the data
NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
if (theConnection) {
    // Create the NSMutableData that will hold
    // the received data
    // receivedData is declared as a method instance elsewhere
    NSMutableData *receivedData=[[NSMutableData data] retain];
} else {
    // inform the user that the download could not be made
}

La razón puede ser:

  1. Declaro receivedData en la propia acción. La anotación dice que debería declarar en otro lugar. ¿Dónde debería declararlo? Debería declarar como propiedad del controlador?

  2. ¿Cómo se puede encontrar el URL [[NSMutableData data] retain] ya que está fuera de la if{}?

¿Fue útil?

Solución

Cuando se utiliza de NSURLConnection initWithRequest: delegado: método, los datos (junto con otras cosas) se envía al objeto delegado en una secuencia de llamadas a métodos. Los métodos son opcionales, así que si su objeto delegado no implementa ellos, el objeto de conexión sólo les salta.

Hay un montón de métodos, por lo que no voy a enumerarlas todas, pero todos están descritos en detalle en la documentación NSURLConnection. Para obtener los datos recibidos que querrá aplicar -conexión: didReceiveData: en el objeto delegado. Este método será llamado, potencialmente más de una vez, con un objeto NSData que representa los datos recibidos recientemente. A continuación, puede añadir que a su objeto NSMutableData existente o hacer cualquier otra cosa que tiene sentido con ella. Usted sabrá que ha recibido todos los datos cuando -connectionDidFinishLoading:. Se llama en el objeto delegado

Para responder a sus dos preguntas específicas:

  1. Sí, usted debe declarar como una propiedad del objeto controlador. También debe asegurarse de asignar el objeto antes de llamar initWithRequest de NSURLConnection: delegar :, ya que la conexión se iniciará la carga de datos de forma asíncrona, tan pronto como se crea el objeto de conexión. Alternativamente, usted podría implementar -conexión: didReceiveResponse:. En el delegado, comprobar el estado de HTTP, y crear el objeto de datos a continuación

  2. El objeto de datos mutables no puede encontrar el URL, la conexión, o sus datos a medida que lo tienes configurado, pero si usted sigue los pasos que he descrito a continuación, puede añadir datos a ella como se trata, y lo utilizan cuando se termina la conexión.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top