Enquanto a mudança vista na barra de navegação, como parar de rosca NSOperationQueue com segurança, sem erro EXC_BAD_ACCESS
-
18-09-2019 - |
Pergunta
Eu estou usando um UITableView para mostrar algumas mensagens de cordas, e eu uso NSOperationQueue para realizar uma NSOperation personalizado que fetchs mensagem na discussão de fundo. Depois de uma mensagem de buscar com sucesso, personalizado NSOperation irá notificar o controlador de UITableView para mostrá-lo.
Se eu clicar novamente o botão na barra de navegação para alternar entre o UITableView para outro ponto de vista, afinal mensagem carregado, cada coisa é OK. Mas, se eu clicar no botão voltar, enquanto alguns mensagem ainda carregando, um EXC_BAD_ACCESS é jogar. Tenho verificado que a exceção aconteceu enquanto personalizado NSOperation notificar controlador UITableView com o método performSelectorOnMainThread
. Som como o controlador alvo UITableView não é inválido após vista ligado, mas acho Controlador de navegação irá realizar a instância controlador de vista. Posso saber como resolver esse problema? Obrigado.
operação personalizado é inicializado no controlador UITableView com seguinte código:
StatusMessageLoadingOperation *operation = [[StatusMessageLoadingOperation alloc]
initWithData:person
messageArray:cachedStatusMessages
target:self
action:@selector(didFinishStatusMessages:)];
[operationQueue addOperation:operation];
[operation release];
A classe NSOperation personalizado irá atualizar UITableView com seguinte código:
- (void)main{
for (int i = 0; i < [[person statusMessages] count]; i++) {
[target performSelectorOnMainThread:action withObject:messageArray waitUntilDone:NO];
}
}
Solução
Você já tentou chamar [operationQueue cancelAllOperations]
em seu método viewWillDisappear
?
Outras dicas
Porque estalando um chamadas controlador de vista que o método -dealloc
do controlador, você pode estar liberando sua fila muito cedo, e alguma outra parte do seu aplicativo está tentando acessar a fila ou uma operação dentro dele que não existe mais.
A minha recomendação é colocar o seu exemplo NSOperationQueue *myQueue
em seu delegado aplicação.
Usar métodos -applicationDidFinishLaunching:
e -dealloc
do delegado aplicativo para inicializar e libertar sua fila e seu conteúdo.
Ao separar sua fila do controlador de vista, a sua fila não vai ser liberada quando você pop fora de um controlador de vista da sua pilha de navegação. Ele e quaisquer operações restantes ainda deve estar disponível para o resto do aplicativo.
Para torná-lo mais fácil de acessar sua fila, configurar a seguinte definição de macro:
#define UIAppDelegate ((MyAppDelegate *)[UIApplication sharedApplication].delegate)
Você pode então usar a macro para acessar sua fila da seguinte forma, por exemplo:.
NSLog(@"%@", [[UIAppDelegate myQueue] operations]);
Ou, por exemplo:
[[UIAppDelegate myQueue] addOperation:myOperation];