2012-02-15 9 views
7

En primer lugar, las preguntas son fallas simiple .. si solo quieres ver lo que se saltan al final de esta publicación y las verás en negrita ... para obtener más detalles, entonces puedes leer el resto de esta publicación ...nsurlconnection solicitud asíncrona

Estoy tratando de resolver mi NSURLConnection para que funcione sin problemas y lo entiendo bien. Existe una profunda falta de ejemplos/tutoriales para conexiones asíncronas en Internet o no, que pueda encontrar que expliquen lo que está sucediendo con cualquier nivel de profundidad que no sea la conexión y la ejecución, lo que después de trabajar parece bastante simple. Espero que esta pregunta pueda llenar el vacío que siento que existe para otros usuarios.

Por lo tanto, en mi archivo .h he importado los encabezados de fundaciones y he declarado los métodos necesarios para la recepción o falta de datos recibidos (errores, etc.).

.h

#import <UIKit/UIKit.h> 
#import <Foundation/Foundation.h> //add foundations 
//.. other headers can be imported here 

@interface MyViewController: UITableViewController { 

//Im not setting any delegates to access the methods because Is all happening in the same 
//place so I just use the key word 'self' when accessing the methods declared below 
//I'm not sure if this is the best thing to do but I wasn't able to get my head around declaring the delegate or how it would help me with the way I have set up my request etc. 

} 
- (IBAction)setRequestString:(NSString *)string; //this method sets the request and connection methods 

//these methods receive the response from my async nsurlconnection 
- (void)receivedData:(NSData *)data; 
- (void)emptyReply; 
- (void)timedOut; 
- (void)downloadError:(NSError *)error; 

Así que esa es mi archivo de cabecera .. bastante simple que no necesita mucha explicación.

.m

//call setRequestString from some other method attached to a button click or something 
[self setRequestString:@"rss.xml"]; 
//.. 

- (IBAction)setRequestString:(NSString *)string 
{ 
    //Set database address 
    NSMutableString *databaseURL = [[NSMutableString alloc] initWithString:@"http:www.comicbookresources/feeds/"]; // address not real jsut example 

    //append the string coming in to the end of the databaseURL 
    [databaseURL appendString:string]; 

    //prepare NSURL with newly created string 
    NSURL *url = [NSURL URLWithString:databaseURL]; 

    //AsynchronousRequest to grab the data 
    NSURLRequest *request = [NSURLRequest requestWithURL:url]; 
    NSOperationQueue *queue = [[NSOperationQueue alloc] init]; 

    [NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) 
    { 
     if ([data length] > 0 && error == nil){ 
      [self receivedData:data]; 
     }else if ([data length] == 0 && error == nil){ 
      [self emptyReply]; 
     }else if (error != nil && error.code == NSURLErrorTimedOut){ //used this NSURLErrorTimedOut from foundation error responses 
      [self timedOut]; 
     }else if (error != nil){ 
      [self downloadError:error]; 
     } 
    }]; 
} 

ahora configurar los métodos que se inicializan en el archivo .h y llama en la sentencia if anterior

- (void)receivedData:(NSData *)data 
{ 
    NSString* newStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 
    NSLog(@"%@", newStr); //logs recived data 
    //now you can see what data is coming in on your log 
    //do what you want with your data here (i.e. start parsing methods 
} 
- (void)emptyReply 
{ 
    //not sure what to do here yet? 
} 
- (void)timedOut 
{ 
    //also not sure what to do here yet? 
} 
- (void)downloadError:(NSError *)error 
{ 
    NSLog(@"%@", error); 
    UIAlertView *errorAlert = [[UIAlertView alloc] initWithTitle:@"Error!" message:@"A connection failure occurred." delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil]; 
    [errorAlert show]; 
} 

Cool entonces que más o menos lo básico de lo que hice allí mismo ... ahora las preguntas que tengo son las siguientes.

Pregunta uno: Cuando llamo NSURLConnection al igual que

[NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) 
     { 

Lo que está sucediendo aquí lo es el^cuenta es que la ejecución de todo ese bloque (incluyendo las sentencias if) en un subproceso diferente o algo ? porque se parece mucho al gran formato central de despacho pero ligeramente diferente.

Pregunta dos: lo que debería estar haciendo dentro emptyReply & timedOut métodos?

Pregunta tres: ¿Cómo incorporaría el almacenamiento en caché a esto? Me gustaría guardar en caché las respuestas que recibo de diferentes solicitudes. es decir, con mi setRequestString verás que hay un parámetro de entrada de cadena, por lo que puedo solicitar diferentes feeds rss con el mismo método ... Necesito averiguar cómo guardar estas respuestas en cachés individuales ... pero no estoy seguro por dónde empezar eso.

Finalmente Si ha llegado hasta aquí, muchas gracias por leer mi pregunta. Esperemos que con sus respuestas podamos obtener una solución bastante buena aquí ... que otras personas puedan usar por sí mismas y escoger y elegir los bits y las piezas que necesitan que funcionen para su propia solución.

De todos modos muchas gracias por leyendo y espero sus respuestas ...incluso si se trata de refrendas a tutoriales o ejemplos que piensas que podrían ayudarme ... todo es bueno. Solo quiero entender por completo qué está pasando y cuál es una buena solución.

Respuesta

5
  1. Lea acerca de los bloques en la documentación de Apple. Es nuevo. O puede leer here
  2. Puede mostrar errores como el tiempo de espera excedido de la solicitud, etc. En realidad, no tiene que manejarlos por separado del error a menos que tenga una lógica especial.
  3. probar esto por el almacenamiento en caché

    NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData timeoutInterval:TIMEOUT_INTERVAL]; 
    
+0

gracias por la respuesta. Cool leerá sobre los bloques de este arvo. Con respecto a tu ejemplo de caché ... No quiero no guardar en caché las respuestas ... me gustaría guardar las respuestas en caché ... sin embargo, no estoy seguro de cómo manejarlas ... si necesito otro método para esto ... o lo hago pongo mi nsurlconnection en una declaración if y uso las diferentes políticas de cahce que se encuentran aquí https://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSURLRequest_Class/Reference/Reference.html gracias de nuevo por la respuesta ... Voy a hacer una investigación sobre bloques ahora ... –

+0

muy buena respuesta –

Cuestiones relacionadas