2010-11-24 7 views
11

Me gustaría iniciar una solicitud de servidor, puede cancelarla.Objective-C: solicitudes de servidor en un hilo (como AsyncTask en Android)

Mi idea es iniciar la solicitud en un hilo para que la interfaz de usuario no se congele. Entonces puedes matar todo el hilo incluyendo la solicitud con un clic en el botón "Cancelar".

Con Android funciona: la solicitud del servidor se inicia en una "AsyncTask" y en el método "onReturn()". Puedo reaccionar tan pronto como finalice la solicitud del servidor.

¿Cómo puedo implementar esto usando Objective-C en iOS? Mi primer intento fue una "NSInvocationOperation". Puede cancelar la operación, pero es difícil de manejar cuando se completa una solicitud y los resultados están disponibles. Creo que NSInvocationOperation no es la solución para mi problema.

¿Me recomendarías a mí? ¿NSThread es la elección correcta para mí?

¡Muchas gracias!

Respuesta

5

Nota!

Th es extremadamente viejo, la respuesta está aquí solo para propósitos históricos.

La maravillosa biblioteca ASIHttpRequest ya no existe; la tecnología es totalmente diferente ahora.


Es increíblemente fácil de hacer esto con ASIHttpRequest.

(Asincrónico es tan simple que no hay ninguna razón para que lo haga de forma no asíncrona.)

Aquí hay algunos extractos aproximados que podrían ayudarlo a comenzar.

... 
ASIFormDataRequest *request; 
... 
NSURL *url = [NSURL URLWithString:@"https://blah.blah/blah.cgi?blah"]; 
request = [ASIFormDataRequest requestWithURL:url]; 

[request setPostValue:@"fred" forKey:@"username"]; 
[request setPostValue:@"flint" forKey:@"passie"]; 
[request setPostValue:@"stone" forKey:@"town"]; 

// send up data... 
[request setData:[NSData dataWithBytes:blah length:blah] forKey:@"thefile"]; 

// or perhaps something like... 
[request setData:imageData withFileName:@"blah.png" 
     andContentType:@"image/jpeg" forKey:@"photoimage"]; 

[request setDelegate:self]; 
[request setDidFinishSelector:@selector(postingDone:)]; 
[request setDidFailSelector:@selector(postingDoneProblem:)]; 
[request startAsynchronous]; 
... 

-(void) postingDone:(ASIHTTPRequest *)request 
    { 
    // it worked 
    } 
-(void) postingDoneProblem:(ASIHTTPRequest *)request 
    { 
    // failed 
    } 

No podría ser más fácil. Básicamente estás simplemente escribiendo los campos y valores.

por su pregunta, aquí es cómo se cancela una solicitud "en vuelo" ... acaba de establecer el delegado a cero y luego "cancelar" la misma.

[myRequest setDelegate:nil]; 
    [myRequest cancel]; 
    [myRequest release]; 

ASIHttpRequest es la "biblioteca de milagros". Si eres nuevo en iOS, ASIHttpRequest es simplemente LA biblioteca de terceros más utilizada. Esencialmente, cada aplicación de iPhone de las 300,000 aplicaciones de iPhone lo usa.

De ser posible, ASEGÚRESE de donarle unos pocos dólares al hombre: si deja de prestarle apoyo a esa biblioteca, 100.000 programadores de iPhone son enloquecidos.

la documentación es trivial, un niño puede seguir:
http://allseeing-i.com/ASIHTTPRequest/How-to-use
"Creación de una solicitud asincrónica"

es probable que sea - casi con seguridad - la biblioteca de red más sorprendentemente sencilla en cualquier plataforma. Es trivial hacer lo que describes, felizmente. Disfrutar.

2

NSURLConnection es asíncrono por defecto y admite la cancelación, así como los métodos de delegado cuando se ha establecido la conexión, se han recibido datos o se ha completado la solicitud completa.

También se realiza la transferencia de datos en segundo plano para que la IU se mantenga receptiva.

2

El código de red asíncrono incorporado de Cocoa no está basado en subprocesos, pero funciona con eventos de ciclo de ejecución, pero el resultado (conexiones asíncronas) es el mismo.

Crea un NSURLConnection con +[NSURLConnection connectionWithRequest:delegate:]. El delegado que configure será informado sobre el progreso de la conexión y puede cancelarlo en cualquier momento con -[NSURLConnection cancel].

1

Salida ASIHTTPRequest, específicamente, la subclase ASINetworkQueue, que se describe como:

ASINetworkQueue

Una subclase de NSOperationQueue que puede usarse para seguir el progreso a través de múltiples peticiones.

sólo he utilizado ASIHTTPRequest para una sola petición síncrona para descargar directamente en el disco, que era fácil de implementar, pero he oído buenos informes del uso de colas para gestionar múltiples peticiones al servidor asíncronos a la vez.

Cuestiones relacionadas