2011-12-15 5 views
21

Mi piacerebbe sapere come ottenere un valore di ritorno 1 o 0 solo .... indietro da una richiesta URL in modo asincrono.come inviare una richiesta URL asincrona?

momento lo faccio in questo modo:

 NSString *UTCString = [NSString stringWithFormat:@"http://web.blah.net/question/CheckQuestions?utc=%0.f",[lastUTCDate timeIntervalSince1970]]; 
     NSLog(@"UTC String %@",UTCString); 
     NSURL *updateDataURL = [NSURL URLWithString:UTCString]; 
     NSString *checkValue = [NSString stringWithContentsOfURL:updateDataURL encoding:NSASCIIStringEncoding error:Nil]; 
     NSLog(@"check Value %@",checkValue); 

questo funziona, ma si sta bloccando il mio thread principale finché non ho ricevuto una risposta indietro dall'URL, come faccio a impostarlo in modo che possa farlo in un altro thread invece del thread principale?

EDIT: RISPOSTA finisco upcalling mia funzione con questo, funziona bene :)

[self performSelectorInBackground:@selector(shouldCheckForUpdate) withObject:nil]; 
+5

Come di iOS 5, è possibile utilizzare '+ (void) sendAsynchronousRequest: (NSURLRequest *) coda di richieste: (NSOperationQueue *) coda completionHandler: (void (^) (NSURLResponse *, NSData *, NSError *) handler', invece, che è più semplice e chiaro per le richieste semplici rispetto alla creazione di un oggetto delegato. Proverò a scrivere una risposta che mostri questo metodo più tardi. –

+1

@MarkAmery Sarebbe bello vedere la tua risposta. Ho difficoltà a trovare un semplice esempio di "sendAsynchronousRequest". –

risposta

28

è possibile utilizzare NSURLConnection classe

NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:url]]; 
[[[NSURLConnection alloc] initWithRequest:request delegate:self] autorelease]; 

e gestire la sua risposta e gli errori che utilizzano i suoi metodi delegato.

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response 
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error 
- (void)connectionDidFinishLoading:(NSURLConnection *)connection 

Potete trovare attuazione NSURLConnection

Edit: Anche se NSURLConnection è fornito da Apple è il modo più consigliato di mettere richiesta URL. Ma ho trovato la libreria AFNetworking molto rapida, facile da implementare e solida ma semplice come implementazione di terze parti. Dovresti fare un tentativo.

+1

quale metodo dovrei usare per ottenere i valori del cookie ?? – kAnNaN

5

Usa NSURLConnection e fare la vostra richiesta. Poi si può iniziare il collegamento sincrono o asincrono con i metodi di NSURLConnection:

Caricamento dei dati sincrona

+ sendSynchronousRequest:returningResponse:error: 

Caricamento dati in modo asincrono

+ connectionWithRequest:delegate: 
– initWithRequest:delegate: 
– initWithRequest:delegate:startImmediately: 
– start 

verificare la classe NSURLConnection in Apple Developer API Reference.

+0

ecco il link: http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSURLConnection_Class/Reference/Reference.html – samfisher

26

provare questo:

.h:

NSMutableData *responseData; 

.m:

- (void)load 
{ 
    NSURL *myURL = [NSURL URLWithString:@"http://www.example.com"]; 
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:myURL cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:60]; 

    [[NSURLConnection alloc] initWithRequest:request delegate:self]; 
} 

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response 
{ 
    responseData = [[NSMutableData alloc] init]; 
} 

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 
{ 
    [responseData appendData:data]; 
} 

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error 
{ 
    [responseData release]; 
    [connection release]; 
    [textView setString:@"Unable to fetch data"]; 
} 

- (void)connectionDidFinishLoading:(NSURLConnection *)connection 
{ 
    NSLog(@"Succeeded! Received %d bytes of data",[responseData 
                length]); 
    NSString *txt = [[[NSString alloc] initWithData:responseData encoding: NSASCIIStringEncoding] autorelease]; 
} 
+0

ho solo bisogno di una risposta di 1 o 0, è troppo per questo? – Desmond

+0

@Maulik Aggiungi "Smart Developers" Room. – MinuMaster

+0

@ Maulik, mi hai salvato la giornata, grazie mille! – DeZigny

2

C'è un esempio in iOS XCode documentazione chiamato LazyTableImages. Ciò comporta un URL asincrono e il caricamento asincrono delle immagini nelle celle UITableView visualizzate sullo schermo dopo lo scorrimento. Eccellente esempio di protocolli, gestione asincrona dei dati, ecc.

3

Copia senza vergogna da https://gist.github.com/knmshk/3027474. Tutti i crediti vanno a https://gist.github.com/knmshk.

xmlData = [[NSMutableData alloc] init]; 
NSURL *url = [NSURL URLWithString: 
@"http://forrums.bignerdranch.com/smartfeed.php?" 
@"limit=NO_LIMIT&count_limit20&sort_by=standard&" 
@"feed_type=RSS2.0&feed_style=COMPACT"]; 
NSURLRequest *request = [NSURLRequest requestWithURL:url]; 
//connection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:YES]; 
NSOperationQueue *queue = [[NSOperationQueue alloc]init]; 
[NSURLConnection sendAsynchronousRequest:request 
            queue:queue 
         completionHandler:^(NSURLResponse *response, NSData *data, NSError *error){ 
          if (error) { 
           xmlData = nil; 
           NSLog(@"error:%@", error.localizedDescription); 
          } 
          [xmlData appendData:data]; 
         }];