Sobes.tech
Junior

Como atualizar as coleções de dados em aplicações iOS?

sobes.tech IA

Resposta da IA

Existem várias formas de atualizar coleções de dados no iOS:

  • reloadData(): A forma mais simples, mas menos eficiente. Recarrega todos os dados completamente.

    tableView.reloadData()
    
  • beginUpdates()/endUpdates(): Permite fazer alterações em lote (inserções, eliminações, atualizações de linhas/seções) com animação. Requer gestão manual dos índices.

    tableView.beginUpdates()
    tableView.insertRows(at: [IndexPath(row: newData.count - 1, section: 0)], with: .automatic)
    tableView.endUpdates()
    
  • performBatchUpdates(_:completion:): Uma alternativa mais moderna e preferida a beginUpdates()/endUpdates(). Também realiza alterações em lote com animação.

    collectionView.performBatchUpdates({
        collectionView.insertItems(at: [IndexPath(item: newData.count - 1, section: 0)])
    }, completion: nil)
    
  • diffable data sources: Desde o iOS 13, UICollectionViewDiffableDataSource e UITableViewDiffableDataSource oferecem uma forma declarativa de gerir dados. As diferenças entre a versão antiga e a nova dos dados são calculadas automaticamente usando Diffing.

    struct MySection: Hashable {
        let id = UUID()
    }
    
    struct MyItem: Hashable {
        let id = UUID()
        let title: String
    }
    
    var dataSource: UICollectionViewDiffableDataSource<MySection, MyItem>!
    
    // ...
    
    var snapshot = NSDiffableDataSourceSnapshot<MySection, MyItem>()
    snapshot.appendSections([MySection()])
    snapshot.appendItems([MyItem(title: "New Item")])
    dataSource.apply(snapshot, animated: true)
    
  • Controlador de resultados recuperados do Core Data: Para trabalhar com Core Data, NSFetchedResultsController rastreia automaticamente as mudanças e notifica o delegado para atualizar a interface de utilizador.

    // No delegado do NSFetchedResultsController
    - (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedObjectChangeType)type newIndexPath:(NSIndexPath *)newIndexPath {
        switch(type) {
            case NSFetchedResultsChangeInsert:
                [self.tableView insertRowsAtIndexPaths:@[newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
                break;
            // ... outros tipos de NSFetchedObjectChangeType
        }
    }
    

A escolha do método depende da complexidade da atualização, da necessidade de animação e da arquitetura utilizada (por exemplo, Core Data). Diffable data sources são a abordagem mais recomendada para novos projetos.