nsurlconnection asynchronous request

En primer lugar, las preguntas son similares al fracaso … si solo quieres ver qué saltan al final de esta publicación, las verás en negrita … para más detalles, puedes leer el rest de esta publicación …

Solo estoy tratando de arreglar mi NSURLConnection para que funcione sin problemas y entiendo esto correctamente. Existe una profunda falta de ejemplos / tutoriales para conexiones asíncronas en Internet o no hay ninguna que pueda encontrar que explique lo que está sucediendo con cualquier nivel de profundidad que no sea poner en funcionamiento la connection que, después de trabajar en ella, parece bastante simple. Con suerte, esta pregunta puede llenar el vacío que siento que está ahí para otros usuarios.

Entonces, en mi file .h he importado los encabezados de las fundaciones y declarado los methods requeridos para la recepción o falta de datos recibidos (errores, etc.).

.marido

#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 declanetworking 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 ese es mi file de encabezado … bastante simple, no se necesita mucha explicación.

.metro

 //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 configura los methods que se inicializaron en el file .h y llamaron en la instrucción 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 (ie 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 occurnetworking." delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil]; [errorAlert show]; } 

Genial para que los conceptos básicos de lo que he hecho allí … ahora las preguntas que tengo son las siguientes.

Primera pregunta: donde llamo a NSURLConnection como si

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

¿Qué está sucediendo aquí? ¿Cuál es la razón por la que se ejecuta ese bloque completo (incluidas las sentencias if) en un hilo diferente o algo así? porque se ve mucho como el formatting de envío central grande pero ligeramente diferente.

Pregunta dos: ¿qué debo hacer dentro de los methods emptyReply y timedOut ?

Pregunta tres: ¿Cómo incorporaré el almacenamiento en caching en esto? Me gustaría almacenar en caching las respuestas que recibo de diferentes requestes. es decir, con mi setRequestString verá que hay un parámetro de input de cadena, por lo que puedo solicitar diferentes canales de RSS con el mismo método .. Necesito averiguar cómo almacenar en caching estas respuestas en cachings individuales … pero no estoy seguro de por dónde empezar eso.

Finalmente, si ha llegado hasta aquí, muchas gracias por leer mi pregunta. Con suerte, con sus respuestas podemos get una solución muy buena para ir aquí … que otras personas puedan usar para ellos mismos y escoger y elegir los bits y detalles que necesitan que funcionen para su propia solución.

De todos modos muchas gracias por leer y espero sus respuestas … incluso si son solo refrences a tutoriales o ejemplos que crees que podrían ayudarme … todo es bueno. Solo quiero entender completamente lo que está pasando y cuál es una buena solución. .

  1. Lea acerca de los bloques en la documentation de Apple. Es nuevo. O puede leer aqui
  2. Puede mostrar errores como la request caducada, etc. Realmente no tiene que manejarlos por separado que el error, a less que tenga lógica especial.
  3. Intente esto para el almacenamiento en caching

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