Jak aktualizować kolekcje danych w aplikacjach iOS?
sobes.tech AI
Odpowiedź od AI
Istnieje kilka sposobów aktualizacji kolekcji danych w iOS:
-
reloadData(): Najprostszy, ale najmniej wydajny sposób. Całkowicie przeładowuje wszystkie dane.tableView.reloadData() -
beginUpdates()/endUpdates(): Pozwala na wykonywanie pakietowych zmian (wstawianie, usuwanie, aktualizacja wierszy/sekcji) z animacją. Wymaga ręcznego zarządzania indeksami.tableView.beginUpdates() tableView.insertRows(at: [IndexPath(row: newData.count - 1, section: 0)], with: .automatic) tableView.endUpdates() -
performBatchUpdates(_:completion:): Nowsza i preferowana zamianabeginUpdates()/endUpdates(). Również wykonuje pakietowe zmiany z animacją.collectionView.performBatchUpdates({ collectionView.insertItems(at: [IndexPath(item: newData.count - 1, section: 0)]) }, completion: nil) -
diffable data sources: Od iOS 13,UICollectionViewDiffableDataSourceiUITableViewDiffableDataSourcezapewniają deklaratywny sposób zarządzania danymi. Różnice między starą a nową wersją danych są automatycznie obliczane za pomocą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) -
Kontroler wyników pobranych z Core Data: Aby pracować z Core Data,
NSFetchedResultsControllerautomatycznie śledzi zmiany i powiadamia delegata o konieczności odświeżenia UI.// W delegacie 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; // ... inne typy NSFetchedObjectChangeType } }
Wybór metody zależy od złożoności aktualizacji, potrzeby animacji i użytej architektury (np. Core Data). Diffable data sources są najbardziej zalecanym podejściem dla nowych projektów.