Sobes.tech
Junior

Πώς ενημερώνετε τις συλλογές δεδομένων στις εφαρμογές iOS;

sobes.tech AI

Απάντηση από AI

Υπάρχουν διάφοροι τρόποι για την ενημέρωση συλλογών δεδομένων σε iOS:

  • reloadData(): Ο πιο απλός, αλλά λιγότερο αποδοτικός τρόπος. Φορτώνει ξανά όλα τα δεδομένα πλήρως.

    tableView.reloadData()
    
  • beginUpdates()/endUpdates(): Επιτρέπει την εκτέλεση πακέτων αλλαγών (εισαγωγή, διαγραφή, ενημέρωση γραμμών/ενότητες) με κινούμενα σχέδια. Απαιτεί χειροκίνητη διαχείριση των δεικτών.

    tableView.beginUpdates()
    tableView.insertRows(at: [IndexPath(row: newData.count - 1, section: 0)], with: .automatic)
    tableView.endUpdates()
    
  • performBatchUpdates(_:completion:): Μια πιο σύγχρονη και προτιμώμενη εναλλακτική του beginUpdates()/endUpdates(). Εκτελεί επίσης πακέτα αλλαγών με κινούμενα σχέδια.

    collectionView.performBatchUpdates({
        collectionView.insertItems(at: [IndexPath(item: newData.count - 1, section: 0)])
    }, completion: nil)
    
  • diffable data sources: Από το iOS 13 και μετά, τα UICollectionViewDiffableDataSource και UITableViewDiffableDataSource προσφέρουν έναν δηλωτικό τρόπο διαχείρισης δεδομένων. Οι υπολογισμοί διαφορών μεταξύ παλαιών και νέων δεδομένων πραγματοποιούνται αυτόματα μέσω του 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: Για εργασία με το Core Data, ο NSFetchedResultsController παρακολουθεί αυτόματα τις αλλαγές και ενημερώνει τον διαχειριστή για την ανάγκη ενημέρωσης του UI.

    // Στον διαχειριστή του 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;
            // ... άλλοι τύποι NSFetchedObjectChangeType
        }
    }
    

Η επιλογή της μεθόδου εξαρτάται από την πολυπλοκότητα της ενημέρωσης, την ανάγκη για κινούμενα σχέδια και την αρχιτεκτονική που χρησιμοποιείται (π.χ. Core Data). Τα Diffable data sources είναι η πιο συστηνόμενη προσέγγιση για νέα έργα.