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:
Listno 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.
What to read next
Want more posts about SwiftUI?
Posts in the same category are usually the best next step for reading more on this topic.
View same categoryWant to keep following #iOS?
Tags are useful for related tools, specific problems, and similar troubleshooting notes.
View same tagWant to explore another direction?
If you are not sure what to read next, return to the homepage and start from categories, topics, or latest updates.
Back home