É possível executar um completeBlock de ASIHTTPRequest/AFNetworking em um thread em segundo plano?
-
13-11-2019 - |
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...
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.