Truques para melhorar o desempenho de rolagem do iPhone UITableView?

Eu tenho um uitableview que carrega imagens bastante grandes em cada célula e as alturas de células variam dependendo do tamanho da imagem. O desempenho de rolagem é decente, mas às vezes pode ser irregular.

Eu encontrei estas dicas que encontrei no blog da FieryRobot:

scrolling-com-uitableview glassy

scrolling-with-uitableview

Alguém tem alguma dica para melhorar o desempenho de rolagem do uitableview?

  1. Armazenar em cache a altura das linhas (a exibição de tabela pode solicitar isso com frequência)
  2. Criar um cache usado menos recentemente para as imagens usadas na tabela (e invalidar todas as inputs inativas quando você receber um aviso de memory)
  3. Desenhe tudo no UITableViewCell do UITableViewCell drawRect: se possível, evite subviews a todo custo (ou se você precisar da funcionalidade de acessibilidade padrão, o drawRect: do view de conteúdo drawRect:
  4. Torne sua camada do UITableViewCell opaca (o mesmo vale para a visualização de conteúdo, se você tiver uma)
  5. Use a funcionalidade reusableCellIdentifier conforme recomendado pelos exemplos / documentação do UITableView
  6. Evite gradientes / efeitos charts complicados que não são pré-cozidos na UIImage s
  1. Se você está subclassificando o UITableViewCell , não use um Nib, escreva-o no código. É muito mais rápido do que carregar arquivos Nib.
  2. Se você estiver usando imagens, certifique-se de armazená-las em cache para não precisar carregar mais de uma vez para cada arquivo (se você tiver memory, ficará surpreso com a quantidade de espaço ocupada).
  3. Faça o máximo de elementos opacos possíveis. Da mesma forma, tente não usar imagens com transparência.

O desenvolvedor por trás do Tweetie escreveu bastante sobre isso e tem um código que demonstra como foi feito para esse aplicativo. Basicamente, ele defende uma visualização personalizada por célula de tabela e a desenha manualmente (em vez de fazer a subvisualização com o Interface Builder, entre outras opções).

fast-scrolling-in-tweetie-com-uitableview

Além disso, a Apple atualizou seu próprio código de exemplo para o TableView em seus tutoriais TableViewSuite (talvez em resposta a isso?)

TableViewSuite

# 1 matador de desempenho para rolagem UITableView está desenhando sombras em qualquer camada de visualização de célula, por isso, se o desempenho de rolagem é importante, então não faça sombras a menos que basicamente não abrandar o seu segmento principal.

pensei que isso tinha que ser dito, já que nenhuma das respostas aceitas fazia menção a sombras e camadas. : +)

Qualquer problema com o desempenho de rolagem do UITableView pode ser resolvido usando técnicas já descritas em outras respostas. No entanto, muitas vezes um desempenho lento é causado por algo inerentemente errôneo ou repetitivo.

O fato de o UITableView reutilizar as células e o fato de que cada célula pode precisar de sua própria imagem – juntas, torna a solução um pouco complexa. De como está sendo resolvido da maneira geral, aqui eu resumir as coisas que devem ser atendidas:

  1. Carregar dados na fonte de dados – a partir do REST / database. Essa etapa deve ser feita em segundo plano, eventualmente usando dispatch_async junto com a fila do GCD.
  2. Crie e inicialize objects de modelo de dados relevantes e coloque-os dentro de um array
  3. [tableView reloaddata]
  4. Dentro de cellForRowAtIndexPath , inclua o código que irá definir dados (texto) do object de modelo de dados correto da matriz.
  5. Agora, as imagens talvez também sejam na forma de URL, portanto, essa etapa pode ser um pouco estranha devido à reutilização de células feita pela exibição de tabela. O principal é carregar mais uma vez a imagem da cache / URL do dispositivo usando a fila assíncrona e, em seguida, configurá-la para corrigir cell.image (qualquer que seja sua propriedade de imagem da célula).

Para evitar problemas, consulte este tutorial sobre o carregamento lento de imagens dentro da visualização de tabela.