Back home

SwiftUI Series 08 | Armadilhas comuns da lista SwiftUI: atualização, exclusão, salto e desempenho

A verdadeira dificuldade com List é que, uma vez que a identidade dos dados, as atualizações de status e os comportamentos de interação estão emaranhados, é fácil causar problemas juntos.

List é um dos controles do SwiftUI que é mais fácil de “parecer fácil de escrever” e também mais fácil de ter problemas em negócios reais.

Porque muitos exemplos simples funcionam bem:

  • Os dados podem ser exibidos assim que são lançados
  • A atualização suspensa também pode ser acessada
  • Excluir, pular e particionar parecem ter recursos prontos

Mas assim que começar a aparecer no projeto:

  • Paginação
  • Pesquisa
  • Vinculação de status após exclusão
  • Vá para os detalhes e retorne
  • Carregamento de imagem

O problema do List será gradualmente exposto.

1. A causa raiz de muitos problemas da Lista é que a “identidade dos dados” não é pensada com clareza.

Muitos comportamentos do SwiftUI estão fortemente relacionados à identidade. Se os dados da lista “parecem iguais”, mas a identidade é instável, ela aparecerá facilmente mais tarde:

  • Salta ao atualizar
  • Animação estranha ao excluir
  • A posição de rolagem fica anormal após retornar à lista
  • O conteúdo de uma determinada linha é atualizado incorretamente

Portanto, a coisa mais básica e subestimada sobre List é:

  • A identidade de cada item é estável?
  • Essa identidade ainda é confiável ao atualizar, paginar e pesquisar?

Muitas listas de “bugs metafísicos”, a causa raiz final está aqui.

2. A atualização e a paginação geralmente atrapalham o status da lista.

Como a atualização e a paginação modificam essencialmente a “coleção de lista atual”, as alterações na coleção afetarão diretamente:

  • relação de reutilização de células
  • posição de rolagem
  • Estado de carregamento atual
  • Alternar entre estado vazio e estado de conteúdo

Se essas relações não forem esclarecidas, é fácil:

  • A lista piscará quando você puxar para baixo para atualizar.
  • Paginar de volta e recalcular a lista inteira
  • Resultados antigos substituem o novo conteúdo

Portanto, a verdadeira dificuldade com List costuma ser:

  • Quais estados devem ser mantidos durante a atualização?
  • Quais estados devem ser adicionados durante a paginação? -Se haverá conflitos simultâneos entre solicitações do mesmo tipo

3. As operações de exclusão geralmente não são tão simples quanto “excluir um elemento”

Superficialmente, a exclusão apenas remove um elemento da matriz. Mas em listas reais, a exclusão geralmente afeta estas coisas ao mesmo tempo:

  • Coleção de exibição atual
  • Julgamento estadual vazio
  • estado selecionado
  • Estado de salto
  • Status de sincronização de back-end

Se você apenas “excluir primeiro e depois falar”, é fácil:

  • A exclusão foi bem-sucedida, mas a página de detalhes ainda aponta para o objeto antigo
  • Quando a exclusão falha, a lista e o status do servidor são inconsistentes
  • A animação está boa, mas a lógica de reversão da fonte de dados é confusa

Isso mostra que a verdadeira dificuldade na exclusão é:

  • Quem é o proprietário da fonte de dados?
  • A exclusão é uma atualização otimista ou está aguardando confirmação do servidor?
  • Como fechar o status de navegação após a exclusão?

4. Pular é fácil de se enredar na Lista e causar problemas.

É comum considerar listas e saltos como funções independentes, mas em projetos reais eles estão intimamente relacionados.

Perguntas típicas incluem:

  • Exclua o item atual após clicar nos detalhes e o retorno ao status da lista está incorreto.
  • Após a atualização da lista, o caminho original selecionado se tornará inválido.
  • Os resultados da pesquisa saltam para detalhes e depois retornam, e o status da lista é redefinido.

A natureza desses problemas é geralmente:

  • Listar status de dados
  • Status do item selecionado
  • Status do caminho de navegação

não são tratados como o mesmo conjunto de problemas.

5. Problemas de desempenho são particularmente fáceis de explodir na Lista

Porque a lista amplia muitos pequenos problemas.

Por exemplo:

  • a hierarquia de visualização de itens é muito profunda
  • Carregamento e decodificação de imagens tarde demais
  • A conversão de texto e dados é feita na fase de exibição
  • A granularidade da atualização é muito grande

Esses custos podem ser suportáveis em páginas comuns, mas em cenários de rolagem de alta frequência como List, podem facilmente levar a quedas de quadros e oscilações.

Portanto, há muitos problemas de desempenho do List e é particularmente sensível à identidade dos dados, intervalo de atualização e tempo de exibição.

6. Uma ideia mais estável: primeiro trate a Lista como “projeção de estado” em vez de “contêiner para dados”

Uma situação comum é que ao escrever uma lista, o padrão em mente é:

  • Eu tenho um conjunto de dados
  • Colocar na lista

Uma ideia mais estável em projetos reais é:

  • Qual é o status atual da página?
  • Em qual lote de itens da lista esse conjunto de estados deve ser projetado?
  • Quais itens da lista possuem identidades estáveis
  • Quais ações do usuário irão alterar este conjunto de estados

Depois de pensar em List como uma projeção de estado em vez de um simples contêiner, muitas questões começam a ficar claras:

  • Dê prioridade à identidade
  • Excluir, atualizar e paginar não podem ser visualizados separadamente
  • O estado de salto também deve ser considerado em conjunto

7. Conclusão: A verdadeira dificuldade de List é que “identidade, status e interação” podem facilmente se entrelaçar.

Para resumir, eu diria:

List no SwiftUI A parte realmente difícil é que, uma vez que as interações de identidade de dados, status da página e exclusão/atualização/salto estão interligadas, se algum limite não for estabelecido, os problemas serão expostos juntos.

Portanto, se você deseja usar List de forma estável, a chave é primeiro:

  • identidade do item
  • Status da lista
  • Fluxo de status após interação

Endireite essas três coisas.

FAQ

What to read next

Related

Continue reading