despacha_async (despacha_get_main_queue () no disparando después de NSMUTableUrlRequest con TimeOutInterval -- ios campo con grand-central-dispatch campo con nsmutableurlrequest camp Relacionados El problema

dispatch_async(dispatch_get_main_queue() not firing after NSMutableURLRequest with timeoutInterval


1
vote

problema

Español

Estoy usando la siguiente llamada GCD (simplificada) en mi aplicación:

  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{      NSString *query = "/api/something";     NSString *parameters = "a=1234&b=5678";         _myDict = (NSMutableDictionary*)[NetworkUtility postDataToServer:query withParameters:parameters];             // Done with API Call         dispatch_async(dispatch_get_main_queue(), ^{              // Do something          });  });   

Cuando se realiza la llamada a NetworkUtility , se llama una conexión NSURL se llama a:

   NSData *postData = [parameters dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];  NSString *postLength = [NSString stringWithFormat:@"%lu",(unsigned long)[postData length]];   NSString *urlString = [NSString stringWithFormat:@"https://myapp.com%@", query];   NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:urlString] cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData timeoutInterval:7.0];   [request setHTTPMethod:@"POST"];  [request setValue:postLength forHTTPHeaderField:@"Content-Length"];  [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];  [request setHTTPBody:postData];   NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];   return response;   

El resultado es que si la red recibe una respuesta, el bloque dispatch_async(dispatch_get_main_queue() se incendia como se esperaba, pero si el tiempo de llamada de la red y el 9988777664 es nil, el < CÓDIGO> dispatch_async(dispatch_get_main_queue() NUNCA INCENDIENTES.

¿Por qué dispatch_async(dispatch_get_main_queue() no se dispara de inmediato, si el NetworkUtility está devolviendo un valor?

Original en ingles

I am using the following (simplified) GCD call in my app:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{      NSString *query = "/api/something";     NSString *parameters = "a=1234&b=5678";         _myDict = (NSMutableDictionary*)[NetworkUtility postDataToServer:query withParameters:parameters];             // Done with API Call         dispatch_async(dispatch_get_main_queue(), ^{              // Do something          });  }); 

When the call is made to NetworkUtility, a NSURL Connection is called is made to:

 NSData *postData = [parameters dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];  NSString *postLength = [NSString stringWithFormat:@"%lu",(unsigned long)[postData length]];   NSString *urlString = [NSString stringWithFormat:@"https://myapp.com%@", query];   NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:urlString] cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData timeoutInterval:7.0];   [request setHTTPMethod:@"POST"];  [request setValue:postLength forHTTPHeaderField:@"Content-Length"];  [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];  [request setHTTPBody:postData];   NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];   return response; 

The result is that if the network receives a response, the dispatch_async(dispatch_get_main_queue() block fires as expected, but if the network call times out and the _recommendationDictionary is nil, the dispatch_async(dispatch_get_main_queue() never fires.

Why does dispatch_async(dispatch_get_main_queue() not fire immediately, if the NetworkUtility is returning a value?

        
       
       

Lista de respuestas

1
 
vote
vote
La mejor respuesta
 

El bloque es enqueuidado en la cola principal. La cola principal es una cola en serie, y ejecutará los bloques enqueorados en orden.

Si usa un CFRUNLOOP en el hilo principal, entonces la cola de envío principal se drena en ese bucle de ejecución, por lo que si el bucle de ejecución está ocupado con otra actividad, también causará un retraso en la ejecución de esos bloques.

Si realmente no necesita hacer ui u otras actividades que sean serializadas en el hilo principal, probablemente esté mejor sin usar la cola principal.

 

The block is enqueued on the main queue. The main queue is a serial queue, and it will execute the enqueued blocks in order.

If you use a CFRunLoop on the main thread, then the main dispatch queue is drained in that run loop, so if the run loop is occupied with other activity, it will also cause a delay in executing those blocks.

If you don't actually need to do UI or other activities that are serialized on the main thread, you're probably best off not using the main queue.

 
 
 
 

Relacionados problema

0  AFNETWorking Subir Progress Enviando SOAP NSDATA  ( Afnetworking upload progress sending soap nsdata ) 
Estoy usando AFNetworking y desea cargar un objeto SELECT9 a mi servidor. Estoy tratando de cargar en nuestro servidor SOAP, por lo que tengo XML que me h...

2  HTTPS de iPhone POST SOLICITUD  ( Iphone https post request ) 
ho todos! Estoy tratando de hacer un inicio de sesión con el iPhone en un servidor HTTPS. Probé una solución diferente, también AsiHTTPRequest y la solución f...

0  Cómo enviar la solicitud HTTP POST a PHP Service con Objective-C  ( How to send http post request to php service with objective c ) 
Estoy tratando de publicar para PHP y obtener la respuesta. El archivo PHP tiene un eco "hola" que debería simplemente imprimir HELLO. Estoy tratando de proba...

0  AsiHTTPRequest SetDomain -> NsurlRequest equivalente?  ( Asihttprequest setdomain nsurlrequest equivalent ) 
Estoy intentando transitar un código antiguo para las solicitudes de jabón que se basó en gran medida en la biblioteca ASIHTTPRequest , para usar el estándar...

1  NSMUTableURL AddValue Agregar cotizaciones "" Alrededor de la tecla  ( Nsmutableurl addvalue adding quotes around key ) 
Mi objetivo final es una simple vista de iPhone con un interruptor que cuando se convierte en "ON", envía una solicitud de publicación a mi núcleo de chispa (...

0  NSMUTableUrlRequest al nodo / Express no analiza correctamente  ( Nsmutableurlrequest to node express not parsing correctly ) 
Estoy construyendo una aplicación que envía a JSON en un NSMUTableUrlRequest a un servidor donde tengo nodo y exprese ejecutando. La carga útil de JSON se e...

0  ¿Cómo deshabilitar toda la vista mientras obtiene una solicitud?  ( How to disable the whole view while fetching a request ) 
Estoy trabajando con una aplicación de iPhone en la que estoy mostrando imágenes en una vista de desplazamiento. La función "Galería" está funcionando bien,...

2  Solicitud AFHTTPCLIENTE DE PRECISIÓN PARÁSAMETENCIA  ( Afhttpclient requestwithmethod parameterencoding ) 
Quiero usar AFNetworking para un método de POST HTTP con algunos parámetros y dos valores tienen el mismo parámetro. Lo probé: PATH0 Usé Charles Proxy y...

0  Enviando mensajes a una dirección IP y puerto  ( Sending messages to an ip address and port ) 
He estado intentando ponerme la cabeza en esto durante las últimas semanas ahora. Todo lo que quiero hacer es ser capaz de enviar una cadena creada en el ip...

2  NSMUTableUrlRequest: Publicar grandes cantidades de datos  ( Nsmutableurlrequest posting large amounts of data ) 
Necesito enviar grandes cantidades de datos (archivos de imagen) por correo postal en un WebView , por lo que estoy usando NSMutableURLRequest con setHTTP...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos