Enquanto a mudança vista na barra de navegação, como parar de rosca NSOperationQueue com segurança, sem erro EXC_BAD_ACCESS

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

  •  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];
    }
}
Foi útil?

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];
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top