Sobes.tech
Junior

Wie aktualisiert man Datensammlungen in iOS-Anwendungen?

sobes.tech KI

Antwort von AI

Es gibt mehrere Möglichkeiten, Datenkollektionen in iOS zu aktualisieren:

  • reloadData(): Die einfachste, aber am wenigsten effiziente Methode. Lädt alle Daten vollständig neu.

    tableView.reloadData()
    
  • beginUpdates()/endUpdates(): Ermöglicht das Ausführen von Batch-Änderungen (Einfügen, Löschen, Aktualisieren von Zeilen/Sektionen) mit Animation. Erfordert manuelle Verwaltung der Indizes.

    tableView.beginUpdates()
    tableView.insertRows(at: [IndexPath(row: newData.count - 1, section: 0)], with: .automatic)
    tableView.endUpdates()
    
  • performBatchUpdates(_:completion:): Eine modernere und bevorzugte Alternative zu beginUpdates()/endUpdates(). Führt ebenfalls Batch-Änderungen mit Animation durch.

    collectionView.performBatchUpdates({
        collectionView.insertItems(at: [IndexPath(item: newData.count - 1, section: 0)])
    }, completion: nil)
    
  • diffable data sources: Seit iOS 13 bieten UICollectionViewDiffableDataSource und UITableViewDiffableDataSource eine deklarative Möglichkeit, Daten zu verwalten. Die Differenzberechnungen zwischen alter und neuer Datenversion erfolgen automatisch mittels 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 fetched results controller: Für die Arbeit mit Core Data verfolgt NSFetchedResultsController automatisch Änderungen und benachrichtigt den Delegierten, um die UI zu aktualisieren.

    // Im Delegate von 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-Typen
        }
    }
    

Die Wahl der Methode hängt von der Komplexität der Aktualisierung, der Notwendigkeit von Animationen und der verwendeten Architektur ab (z.B. Core Data). Diffable data sources sind der empfohlene Ansatz für neue Projekte.