É possível executar um completeBlock de ASIHTTPRequest/AFNetworking em um thread em segundo plano?

StackOverflow https://stackoverflow.com/questions/9465834

Pergunta

Eu inicio meu ASIHTTPrequest de forma síncrona em um thread separado como este:

//inside this start method I create my ASIHTTPRequest and start it
dispatch_async(dispatch_get_global_queue(0, 0), ^{
    [process start];
});

Mas o completeBlock ainda é acionado no thread principal. É possível manter a execução do completeBlock no mesmo thread em que a solicitação foi iniciada?

A única coisa que posso fazer para resolver isso é definir uma fila de despacho e executar manualmente o completeBlock no mesmo thread, mantendo assim uma referência a uma fila criada.Mas isso não resolve diretamente porque você passaria por um maldito momento no thread principal antes de redirecionar o restante do código para a fila de despacho criada.

Alguém tem uma solução melhor?

EDITAR:O mesmo também se aplica aos blocos de conclusão AFNetworking...

Foi útil?

Solução

Ok, para responder à minha própria pergunta:A estrutura ASIHTTPRequest não tem a opção de iniciar blocos de conclusão em um thread diferente.

Em vez disso, pode-se usar a estrutura AFNetwork.Aqui você tem duas propriedades em qualquer tipo de AFOperation chamada 'sucessoCallbackQueue' e 'falhaCallbackQueue'.Onde você pode adicionar um 'expedição_queue_t'para lidar com a execução de blocos de sucesso e falha.

Espero que isso ajude outras pessoas com o mesmo problema!

ATUALIZAR :Exemplo

 dispatch_queue_t requestQueue = dispatch_queue_create("requestQueue", NULL);
 AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:yourRequest];
 operation.successCallbackQueue = requestQueue;
 operation.failureCallbackQueue = requestQueue;
 [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
    // add code for completion
 } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    // add code for failure
 }];
 [operation start];

Outras dicas

Tente usar uma fila definida de sua própria criação.Então você pode (quando finalmente terminar, em seu bloco de conclusão) sinalizar de volta para a fila global para atualizar qualquer exibição necessária.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top