Sobes.tech
Junior

Hoe werk je datacollecties bij in iOS-apps?

sobes.tech AI

Antwoord van AI

Er zijn verschillende manieren om gegevensverzamelingen in iOS bij te werken:

  • reloadData(): De eenvoudigste, maar minst efficiënte manier. Laadt alle gegevens volledig opnieuw.

    tableView.reloadData()
    
  • beginUpdates()/endUpdates(): Maakt het mogelijk om batchwijzigingen uit te voeren (invoegen, verwijderen, bijwerken van rijen/sekties) met animatie. Vereist handmatige indexbeheer.

    tableView.beginUpdates()
    tableView.insertRows(at: [IndexPath(row: newData.count - 1, section: 0)], with: .automatic)
    tableView.endUpdates()
    
  • performBatchUpdates(_:completion:): Een modernere en voorkeur methode boven beginUpdates()/endUpdates(). Voert ook batchwijzigingen uit met animatie.

    collectionView.performBatchUpdates({
        collectionView.insertItems(at: [IndexPath(item: newData.count - 1, section: 0)])
    }, completion: nil)
    
  • diffable data sources: Vanaf iOS 13 bieden UICollectionViewDiffableDataSource en UITableViewDiffableDataSource een declaratieve manier om gegevens te beheren. De verschillen tussen de oude en nieuwe gegevensversies worden automatisch berekend met behulp van 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)
    
  • Core Data opgehaalde resultaten controller: Voor werken met Core Data houdt NSFetchedResultsController automatisch wijzigingen bij en informeert de delegate over de noodzaak om de UI bij te werken.

    // In de delegate van 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;
            // ... andere NSFetchedObjectChangeType types
        }
    }
    

De keuze van methode hangt af van de complexiteit van de update, de behoefte aan animatie en de gebruikte architectuur (bijvoorbeeld Core Data). Diffable data sources worden aanbevolen voor nieuwe projecten.