Sobes.tech
Middle

Qual é a razão para o indicador de atividade continuar a funcionar após a aplicação ter sido parada?

sobes.tech IA

Resposta da IA

A razão é que no iOS até ao iOS 11, o indicador de atividade (UIActivityIndicatorView) continuava a animar, mesmo que o método stopAnimating() fosse chamado, mas o controlador de vista ou o seu controlador pai não fossem completamente descarregados da memória. O indicador simplesmente deixava de ser exibido visualmente, mas o seu estado interno permanecia "a animar".

Com o iOS 11, o comportamento mudou. Agora, stopAnimating() realmente para a animação e altera o estado interno do indicador.

Falando de versões antigas do iOS ou de possíveis erros no código, a causa poderia ser a seguinte:

  1. Problema com o ciclo de vida do VC: stopAnimating() é chamado em estados não necessários do ciclo de vida do controlador de vista (por exemplo, apenas em viewWillDisappear, mas não em viewDidDisappear ou ao lidar com erros).
  2. Gestão incorreta do objeto: O indicador continua a existir na memória e o seu estado não é redefinido se não for descarregado corretamente ou se houver referências fortes que impeçam a sua libertação.
  3. Erros de multithreading: A chamada a stopAnimating() ocorre fora do thread principal, enquanto que a animação dos elementos UI só pode ser gerida a partir do thread principal.
// Exemplo de chamada correta no thread principal
DispatchQueue.main.async {
    activityIndicator.stopAnimating()
}
  1. Problema com a hierarquia de vistas: A vista que contém o indicador não foi removida da superview ou não foi completamente escondida.
// Exemplo de remoção da superview
activityIndicator.removeFromSuperview()

// Exemplo de ocultar
activityIndicator.isHidden = true
  1. Erros no trabalho com Auto Layout: O indicador continua a ocupar espaço ou as suas dimensões não são redefinidas após parar a animação, criando a ilusão de atividade ou presença.

Nos versões modernas do iOS, este problema é raro e geralmente está relacionado com erros na gestão do ciclo de vida dos objetos ou na multithreading.