Sobes.tech
Junior

Cum se actualizează colecțiile de date în aplicațiile iOS?

sobes.tech AI

Răspuns de la AI

Există mai multe modalități de a actualiza colecțiile de date în iOS:

  • reloadData(): Cea mai simplă, dar cea mai puțin eficientă metodă. Reîncarcă toate datele complet.

    tableView.reloadData()
    
  • beginUpdates()/endUpdates(): Permite efectuarea de modificări în lot (inserare, ștergere, actualizare de rânduri/secțiuni) cu animație. Necesită gestionarea manuală a indicilor.

    tableView.beginUpdates()
    tableView.insertRows(at: [IndexPath(row: newData.count - 1, section: 0)], with: .automatic)
    tableView.endUpdates()
    
  • performBatchUpdates(_:completion:): O alternativă mai modernă și preferată față de beginUpdates()/endUpdates(). De asemenea, efectuează modificări în lot cu animație.

    collectionView.performBatchUpdates({
        collectionView.insertItems(at: [IndexPath(item: newData.count - 1, section: 0)])
    }, completion: nil)
    
  • diffable data sources: Începând cu iOS 13, UICollectionViewDiffableDataSource și UITableViewDiffableDataSource oferă o modalitate declarativă de gestionare a datelor. Diferențele între versiunea veche și cea nouă a datelor sunt calculate automat folosind 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)
    
  • Controlorul de rezultate recuperate din Core Data: Pentru a lucra cu Core Data, NSFetchedResultsController urmărește automat modificările și notifică delegatul despre necesitatea actualizării UI.

    // În delegatul 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;
            // ... alte tipuri de NSFetchedObjectChangeType
        }
    }
    

Alegerea metodei depinde de complexitatea actualizării, de necesitatea animației și de arhitectura utilizată (de exemplu, Core Data). Diffable data sources sunt cea mai recomandată abordare pentru proiecte noi.