2012-02-15 9 views
7

Prima di tutto le domande sono failry simiple .. se vuoi vedere solo quello che salta in fondo a questo post e le vedrai in grassetto .. per maggiori dettagli puoi leggere il resto di questo post ...nsurlconnection asynchronous request

Sto solo cercando di appianare il mio NSURLConnection in modo che funzioni senza intoppi e lo capisco correttamente. Esiste una profonda mancanza di esempi/tutorial per le connessioni asincrone su Internet o non di quelli che riesco a trovare che spiegano cosa sta succedendo con un livello di profondità diverso dall'ottenere la connessione attiva e funzionante che dopo aver lavorato su di esso sembra piuttosto semplice. Speriamo che questa domanda possa riempire il vuoto che sento sia là fuori per gli altri utenti.

Quindi, nel mio file .h ho importato le intestazioni delle basi e dichiarato i metodi richiesti per la ricezione o la mancanza di dati ricevuti (errori, ecc.).

.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; 

di modo che è il mio file di intestazione .. Non abbastanza semplice molto spiegando necessario.

.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]; 
     } 
    }]; 
} 

ora impostare i metodi che sono stati inizializzati nel file .he chiamati in if sopra

- (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]; 
} 

fredda in modo che più o meno le basi di quello che ho fatto proprio lì ... ora le domande che ho sono le seguenti.

Prima domanda: Dove io chiamo NSURLConnection in questo modo

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

Quello che sta accadendo qui qual è il^per è che l'esecuzione di tutto quel blocco (compreso il caso le dichiarazioni) su un thread diverso o qualcosa ? perché assomiglia molto alla grande formattazione di invio centrale ma leggermente diversa.

Domanda due: cosa dovrei fare all'interno emptyReply & TimedOut metodi?

Domanda tre: Come incorporare la memorizzazione nella cache in questo? Vorrei memorizzare nella cache le risposte che torno da diverse richieste. cioè con il mio setRequestString vedrai che c'è un parametro di input per le stringhe, quindi posso richiedere feed RSS diversi con lo stesso metodo .. Ho bisogno di capire come memorizzare queste risposte in cache individuali .. ma non sono sicuro da dove cominciare esso.

Finalmente Se ci sei arrivato fin qui, grazie mille per aver letto la mia domanda. Speriamo che con le tue risposte possiamo ottenere una soluzione carina andando qui .. che altre persone possono usare per se stessi e scegliere i bit e le pezze di cui hanno bisogno che funzionano per la propria soluzione ..

Comunque grazie molte per leggendo e attendo le vostre risposte ..anche se sono solo rifrazioni a tutorial o esempi che pensi possano aiutarmi .. tutto è buono voglio solo capire appieno cosa sta succedendo e che cosa è una buona soluzione.

risposta

5
  1. Leggi i blocchi nella documentazione Apple. È nuovo. Oppure puoi leggere here
  2. Puoi mostrare errori come timeout della richiesta ecc. Non devi gestirli separatamente rispetto a quello di errore se non hai una logica speciale.
  3. Prova questo per il caching

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

grazie per la risposta. Cool leggerà i blocchi di questo arvo. Per quanto riguarda il tuo esempio di cache .. Non voglio mettere in cache le risposte .. vorrei mettere in cache le risposte .. tuttavia non sono sicuro di come gestirle .. se ho bisogno di un altro metodo per questo .. o faccio metti la mia nsurlconnessione in una dichiarazione if e usa le diverse politiche di cahce trovate qui https://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSURLRequest_Class/Reference/Reference.html di nuovo grazie per la risposta .. Sto andando a fare qualche ricerca sui blocchi ora .. –

+0

risposta molto buona –