2011-12-15 16 views
21

Me gustaría saber cómo obtengo un valor de retorno de 1 o 0 solamente ... de vuelta desde una solicitud de URL de forma asíncrona.cómo enviar una solicitud de URL asíncrona?

actualmente lo hago de esta manera:

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

esto funciona, sin embargo, está bloqueando mi hilo principal hasta que me dieron una respuesta de vuelta de la URL, cómo fijo que lo que lo hará en un otro hilo en lugar del hilo principal?

EDIT: RESPUESTA i End upcalling mi función con este, funciona bien :)

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

A partir de iOS 5, se puede usar '+ (void) sendAsynchronousRequest: (NSURLRequest *) cola de solicitudes: (NSOperationQueue *) cola completionHandler: (void (^) (NSURLResponse *, NSData *, NSError *)) handler' en su lugar, que es más fácil y más claro para las solicitudes simples que la creación de un objeto delegado. Trataré de escribir una respuesta que muestre este método más adelante. –

+1

@MarkAmery Sería bueno ver tu respuesta. Tengo dificultades para encontrar un ejemplo simple de 'sendAsynchronousRequest'. –

Respuesta

28

puede utilizar NSURLConnection clase

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

y manejar su respuesta y los errores utilizando sus métodos de delegado.

- (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 

Puede encontrar implementación de NSURLConnection

Editar: NSURLConnection Aunque se proporciona por Apple es la forma más recomendada de colocar solicitud de URL. Pero encontré que la biblioteca AFNetworking ahorra mucho tiempo, es fácil de implementar y robusta pero simple como la implementación de un tercero. Usted debe darle una oportunidad.

+1

qué método debo usar para obtener los valores de las cookies? – kAnNaN

5

Uso NSURLConnection y crea su solicitud. entonces puede iniciar la conexión sincrónica o asincrónica con los métodos de NSURLConnection:

Carga de datos de forma sincrónica

+ sendSynchronousRequest:returningResponse:error: 

Carga de datos de forma asíncrona

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

se comprueba la clase NSURLConnection en API para desarrolladores de Apple de referencia.

+0

aquí está el enlace: http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSURLConnection_Class/Reference/Reference.html – samfisher

26

probar esto:

.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

solo necesito una respuesta de 1 o 0, ¿esto es demasiado para eso? – Desmond

+0

@Maulik Agregar la habitación "Desarrolladores inteligentes". – MinuMaster

+0

@Maulik, salvaste mi día, ¡muchas gracias! – DeZigny

2

Hay un ejemplo en la documentación llamada LazyTableImages iOS XCode. Esto hace una URL asíncrona así como una carga de imagen asincrónica en las celdas UITableView que se muestran en la pantalla después de que se detiene el desplazamiento. Excelente ejemplo de protocolos, manejo de datos asíncronos, etc.

3

Copie desvergonzadamente desde https://gist.github.com/knmshk/3027474. Todos los créditos van 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]; 
         }]; 
Cuestiones relacionadas