Sobes.tech
Junior

Hogyan frissítjük az adatgyűjteményeket iOS alkalmazásokban?

sobes.tech MI

Válasz az MI-től

Az iOS adatgyűjtemények frissítésének több módja is létezik:

  • reloadData(): A legegyszerűbb, de legkevésbé hatékony módszer. Teljesen újratölti az összes adatot.

    tableView.reloadData()
    
  • beginUpdates()/endUpdates(): Lehetővé teszi csomagolt módosítások végrehajtását (beszúrás, törlés, frissítés sorokban/fejezetekben) animációval. Kézi indexkezelést igényel.

    tableView.beginUpdates()
    tableView.insertRows(at: [IndexPath(row: newData.count - 1, section: 0)], with: .automatic)
    tableView.endUpdates()
    
  • performBatchUpdates(_:completion:): Egy modernebb és preferált módszer a beginUpdates()/endUpdates() helyett. Szintén csomagolt módosításokat hajt végre animációval.

    collectionView.performBatchUpdates({
        collectionView.insertItems(at: [IndexPath(item: newData.count - 1, section: 0)])
    }, completion: nil)
    
  • diffable data sources: Az iOS 13-tól kezdődően a UICollectionViewDiffableDataSource és UITableViewDiffableDataSource deklaratív módon kezelik az adatokat. A régi és az új adatszintek közötti különbségek automatikusan kiszámításra kerülnek a Diffing segítségével.

    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 eredményeinek vezérlője: A Core Data-val való munkához az NSFetchedResultsController automatikusan figyeli a változásokat, és értesíti a delegáltat a UI frissítésének szükségességéről.

    // Az NSFetchedResultsController delegáltjában
    - (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;
            // ... más NSFetchedObjectChangeType típusok
        }
    }
    

A módszer kiválasztása a frissítés összetettségétől, az animáció szükségességétől és a használt architektúrától függ (pl. Core Data). A Diffable data sources a legajánlottabb megközelítés új projektekhez.