2011-11-30 10 views
6

Este blog ofrece una buena solución para manejar múltiples NSURLConnections: crear una clase personalizada "CustomURLConnection" que tenga una propiedad adicional tag.Usando la subclase personalizada de NSURLConnection, ¿cómo "encuentra" los datos adicionales en la clase más adelante?

http://blog.emmerinc.be/index.php/2009/03/02/custom-nsurlconnection-class-with-tag/

http://blog.emmerinc.be/index.php/2009/03/15/multiple-async-nsurlconnections-example/

Básicamente, simplemente se ha añadido una propiedad tag a la NSURLConnection exsisting:

CustomURLConnection.m

- (id)initWithRequest:(NSURLRequest *)request delegate:(id)delegate startImmediately:(BOOL)startImmediately tag:(NSString*)tag { 
    self = [super initWithRequest:request delegate:delegate startImmediately:startImmediately]; 

    if (self) { 
     self.tag = tag; 
    } 
    return self; 
} 

luego, más tarde en la normalidad NSURLConnection carga de metanfetamina ods, puede hacer:

- (void)connectionDidFinishLoading:(NSURLConnection *)connection { 

    //Log the connection’s tag 
    CustomURLConnection *ttttag = (CustomURLConnection *)connection; // **HERE** 
    NSLog(@”%@”, ttttag.tag); 


    NSMutableData *dataForConnection = [self dataForConnection:(CustomURLConnection*)connection]; 
    [connection release]; 
} 

Entonces, ahí es donde estoy teniendo problemas. La forma en que lo veo, esto es cómo van las cosas:

  • puedo crear una "conexión + etiqueta"
  • El primer fragmento de código que he publicado anteriormente crea una "conexión" regular (sin tag), que eventualmente llame a los métodos normales de NSURLConnection como connectionDidFinishLoading. ¿Qué pasa con el tag en este punto?
  • En el método connectionDidFinishLoading, puedo volver a conectar la conexión en una "etiqueta de conexión +", y luego encontrar esa información de etiqueta faltante que se ha descartado. ¿Cómo?

Tal vez estoy confundiendo a mí mismo, pero parece como si el tag se descartó cuando se inicia por la NSURLConnection camino normal. Pero luego al convertirlo en la subclase, puedo recuperar nuevamente la propiedad tag. ¿Dónde vivió/se fue mientras tanto?

¿Podría alguien con un mejor entendimiento de la herencia explicarme esto?

+1

No está haciendo una conversión real, todos los objetos Obj-C son simplemente un puntero a una dirección de memoria. Solo le está diciendo al compilador que * supone * que es un 'CustomURLConnection' en el momento de la compilación y esto no tiene ningún impacto en la ejecución real de su código. –

Respuesta

4

Con este código:

[[CustomURLConnection alloc] initWithRequest:... delegate:... startImmediately:... startImmediately tag:...]; 

se crea una instancia de CustomURLConnection. Ahora aquí es donde su comprensión es incorrecta: este objeto CustomURLConnection puede llamar libremente a todos los métodos de sus superclases, pero siempre será CustomURLConnection. El tag siempre está ahí.

Los métodos que se definen en la superclase, como initWithRequest:delegate:startImmediately:, desconocen la etiqueta pero tampoco la tienen. Cuando el método delegado se llama:

- (void)connectionDidFinishLoading:(NSURLConnection *)connection 

el argumento connection es la misma CustomURLConnection que creó a sí mismo por encima. El tipo en la firma del método es diferente, pero eso no importa; porque sabe que esta conexión es del tipo CustomURLConnection, puede simplemente convertir el objeto connection al tipo correcto y acceder a la nueva propiedad. Pero incluso si no hicieras eso, el tag estaría allí todo el tiempo.

+0

Gracias, esa es una buena explicación. Especialmente * "los métodos no conocen la etiqueta, pero tampoco tienen que ser así". * – cksubs

1

no estoy seguro de lo que entendemos por:

El primer fragmento de código que he publicado anteriormente crea una "conexión" regular (sin etiqueta).

Lo que has hecho aquí es crear una subclase de NSURLConnection. En cualquier lugar donde pueda usar este último, puede usar el primero. NSURLConnection* significa "un puntero a un NSURLConnection* o una subclase de él". Entonces, el objeto original que creó era CustomURLConnection e incluía un ivar adicional. Esa ivar no desaparece solo porque los usuarios intermediarios se refieren a ella por su superclase.

Cuestiones relacionadas