Pregunta

Quiero crear una clase para manejar todo el trabajo de conexión HTTP para otras clases (para evitar escribir códigos repetidamente). Lo llamo ConnectionCenter (subclase de NSObject) y le agrego los siguientes códigos:

-(void)connect:(NSString *)strURL obj:(ConnectCenter *)objConnect
{
    NSURLRequest *theRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:strURL]
                                              cachePolicy:NSURLRequestUseProtocolCachePolicy
                                          timeoutInterval:60.0];

    NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:objConnect];
    if (theConnection) 
    {
        // receivedData is declared as a method instance elsewhere
        receivedData = [[NSMutableData data] retain];
    } 
    else 
    { 
        // inform the user that the download could not be made
    }

}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    // append the new data to the receivedData
    // receivedData is declared as a method instance elsewhere
    [receivedData appendData:data];
}

Y otras clases lo llaman pasando una URL y un objeto de ConnectionCenter. Pero el método 'didReceiveData' en ConnectionCenter no se llama. ¿Alguna idea sobre cuál es el problema?

¿Fue útil?

Solución

Deberá llamar a [theConnection setDelegate: self] después de configurar la conexión, ya que connection: didReceiveData: es un método delegado.

Lea el documentación para obtener más información.

Otros consejos

Un par de cosas sobre este código ...

Primero, es confuso qué objeto realmente está configurando como delegado. La llamada a la conexión: didReceiveData: se llamará al delegado de la conexión, que es cualquier objeto que haya pasado a su método connect: obj:. Parece extraño que tenga un método de instancia en ConnectionCenter que pueda iniciar una conexión con un objeto ConnectionCenter diferente como delegado. Asegúrese de estar mirando la conexión: didReceiveData: método en el objeto correcto.

Si no está recibiendo ningún dato, es posible que su conexión no haya podido conectarse o simplemente se haya completado sin devolver ningún dato. Debe implementar connectionDidFinishLoading: y connection: didFailWithError: delegue métodos para que sepa si la conexión ha finalizado, con o sin datos devueltos.

Finalmente, tienes una condición de carrera que te morderá si obtienes una buena y rápida conexión. El objeto NSURLConnection comenzará a ejecutarse tan pronto como lo cree. Si hay algún dato para leer, llamará a connection: didReceiveData: y lo agregará a recibidoData. Pero si la conexión es lo suficientemente rápida, podría terminar intentando agregar datos a un dato recibido que aún no se ha creado. Es una pequeña posibilidad, pero a pesar de que el método de inicio de NSURLConnection no se bloquea, no es prudente hacer suposiciones sobre cuánto trabajo hace para que la conexión funcione antes de regresar. Cree recibidoData antes de iniciar la conexión para que pueda estar seguro de tener un lugar para colocar los datos cuando entren.

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