Kaip atnaujinti duomenų rinkinius iOS programose?
sobes.tech AI
Atsakymas iš AI
Yra keletas būdų atnaujinti duomenų rinkinius iOS:
-
reloadData(): Paprasčiausias, bet mažiausiai efektyvus būdas. Visi duomenys visiškai perkraunami.tableView.reloadData() -
beginUpdates()/endUpdates(): Leidžia atlikti paketinius pakeitimus (įdėjimas, ištrynimas, atnaujinimas eilučių/sekcijų) su animacija. Reikalauja rankinio indeksų valdymo.tableView.beginUpdates() tableView.insertRows(at: [IndexPath(row: newData.count - 1, section: 0)], with: .automatic) tableView.endUpdates() -
performBatchUpdates(_:completion:): Modernesnis ir pageidaujamas pakaitalasbeginUpdates()/endUpdates(). Taip pat atlieka paketinius pakeitimus su animacija.collectionView.performBatchUpdates({ collectionView.insertItems(at: [IndexPath(item: newData.count - 1, section: 0)]) }, completion: nil) -
diffable data sources: Nuo iOS 13,UICollectionViewDiffableDataSourceirUITableViewDiffableDataSourcesiūlo deklaratyvų būdą valdyti duomenis. Skirtumai tarp seno ir naujo duomenų versijų automatiškai apskaičiuojami naudojantDiffing.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: Darbo su Core Data,
NSFetchedResultsControllerautomatiškai stebi pokyčius ir praneša delegatui apie UI atnaujinimo poreikį.// NSFetchedResultsController delegate - (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; // ... kiti NSFetchedObjectChangeType tipai } }
Pasirinkimas priklauso nuo atnaujinimo sudėtingumo, animacijos poreikio ir naudojamos architektūros (pvz., Core Data). Diffable data sources yra rekomenduojamas naujiems projektams.