Sobes.tech
Middle+

Μίλησε για τη βελτιστοποίηση της χρήσης των ακυρώσεων στην ανάπτυξη iOS.

sobes.tech AI

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

Χρήση των setNeedsDisplay() και setNeedsLayout(). Το setNeedsDisplay() προγραμματίζει την επανεγγραφή της προβολής, ενώ το setNeedsLayout() προγραμματίζει την ενημέρωση της διάταξης των προβολών. Και οι δύο λειτουργίες δεν πραγματοποιούν την ενημέρωση άμεσα, αλλά τις βάζουν σε ουρά για τον επόμενο κύκλο ενημέρωσης του περιβάλλοντος χρήστη. Αυτό επιτρέπει στο σύστημα να συνδυάσει πολλά αιτήματα ενημέρωσης σε μια διέλευση, μειώνοντας το φόρτο.

Χρήση του CALayer για βελτιστοποίηση της απόδοσης. Το CALayer είναι ένα ελαφρύ αντικείμενο που διαχειρίζεται το οπτικό περιεχόμενο, αλλά δεν επεξεργάζεται γεγονότα. Η απόδοση των στρωμάτων συχνά συμβαίνει εκτός του κύριου νήματος, βελτιώνοντας την απόδοση. Οι ιδιότητες του στρώματος, όπως το opacity, transform και το backgroundColor, μπορούν να κινούνται χωρίς την ανάγκη να ξαναζωγραφιστεί ολόκληρη η ιεραρχία των προβολών.

Ελαχιστοποίηση των ζωνών επανασχεδίασης. Το σύστημα iOS προσπαθεί να ξανασχεδιάσει μόνο το μέρος της οθόνης που έχει αλλάξει. Ωστόσο, αν η κλήση setNeedsDisplay() γίνεται σε μια προβολή που καλύπτει μεγάλη περιοχή ή σε μια αδιαφανή προβολή, το σύστημα μπορεί να αναγκαστεί να ξανασχεδιάσει μεγάλο μέρος της οθόνης. Πρέπει να προσπαθείτε να καλείτε το setNeedsDisplay() στην μικρότερη δυνατή προβολή που χρειάζεται πραγματικά ενημέρωση.

Αναβολή φόρτωσης περιεχομένου. Αν μια προβολή περιέχει πολύ περιεχόμενο (π.χ. μια μεγάλη λίστα σε UITableView ή UICollectionView), δεν πρέπει να αποδίδεται όλο το περιεχόμενο αμέσως. Αντίθετα, φορτώστε και εμφανίστε το περιεχόμενο καθώς εμφανίζεται στην οθόνη (on-demand). Αυτό μπορεί να μειώσει σημαντικά το φορτίο στο σύστημα κατά την αρχική φόρτωση και κύλιση.

Χρήση cache. Αν η απόδοση ενός συγκεκριμένου τμήματος της προβολής απαιτεί πολύ χρόνο και δεν αλλάζει συχνά, μπορείτε να αποθηκεύσετε το αποτέλεσμα της απόδοσης (π.χ. ως UIImage). Στις επόμενες αποδόσεις, απλώς χρησιμοποιήστε την αποθηκευμένη εικόνα αντί να ξαναζωγραφίσετε.

Παράδειγμα χρήσης του setNeedsDisplay():

class MyView: UIView {
    override func draw(_ rect: CGRect) {
        // Κώδικας απόδοσης
    }

    func updateContent() {
        // Αλλαγή δεδομένων που επηρεάζουν την απόδοση
        setNeedsDisplay() // Προγραμματισμός επανεγγραφής
    }
}

Παράδειγμα χρήσης του setNeedsLayout():

class MyContainerView: UIView {
    private let subview: UIView

    init(subview: UIView) {
        self.subview = subview
        super.init(frame: .zero)
        addSubview(subview)
    }

    required init?(coder: NSCoder) {
        fatalError("init(coder:) δεν έχει υλοποιηθεί")
    }

    override func layoutSubviews() {
        super.layoutSubviews()
        // Ενημέρωση πλαισίου υπο-προβολής
        subview.frame = bounds.insetBy(dx: 10, dy: 10)
    }

    func rearrangeSubviews() {
        // Αλλαγή διάταξης υπο-προβολής
        setNeedsLayout() // Προγραμματισμός αναδιάταξης
    }
}