Sobes.tech
Junior

Comment mettre à jour les collections de données dans les applications iOS?

sobes.tech IA

Réponse de l'IA

Il existe plusieurs façons de mettre à jour les collections de données dans iOS :

  • reloadData() : La méthode la plus simple, mais la moins performante. Recharge complètement toutes les données.

    tableView.reloadData()
    
  • beginUpdates()/endUpdates() : Permet d'effectuer des modifications en lot (insertion, suppression, mise à jour de lignes/séctions) avec animation. Nécessite une gestion manuelle des indices.

    tableView.beginUpdates()
    tableView.insertRows(at: [IndexPath(row: newData.count - 1, section: 0)], with: .automatic)
    tableView.endUpdates()
    
  • performBatchUpdates(_:completion:) : Une alternative plus moderne et préférée à beginUpdates()/endUpdates(). Effectue également des modifications en lot avec animation.

    collectionView.performBatchUpdates({
        collectionView.insertItems(at: [IndexPath(item: newData.count - 1, section: 0)])
    }, completion: nil)
    
  • diffable data sources : Depuis iOS 13, UICollectionViewDiffableDataSource et UITableViewDiffableDataSource offrent une gestion déclarative des données. Les différences entre l'ancienne et la nouvelle version des données sont calculées automatiquement via 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)
    
  • Contrôleur de résultats récupérés de Core Data : Pour travailler avec Core Data, NSFetchedResultsController suit automatiquement les changements et notifie le délégué pour mettre à jour l'interface utilisateur.

    // Dans le délégué de 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;
            // ... autres types de NSFetchedObjectChangeType
        }
    }
    

Le choix de la méthode dépend de la complexité de la mise à jour, de la nécessité d'animation et de l'architecture utilisée (par exemple, Core Data). Diffable data sources est l'approche la plus recommandée pour les nouveaux projets.