Sobes.tech
Middle+

Pastāsti par invalidāciju izmantošanas optimizāciju iOS izstrādē.

sobes.tech AI

Atbilde no AI

Izmantošana setNeedsDisplay() un setNeedsLayout(). setNeedsDisplay() plāno pārkrāsošanu skatā, bet setNeedsLayout() plāno izkārtojuma atjaunināšanu. Abas funkcijas neveic atjauninājumu uzreiz, bet tās iekļauj rindā nākamajam lietotāja saskarnes atjaunināšanas ciklam. Tas ļauj sistēmai apvienot vairākus atjaunināšanas pieprasījumus vienā pārbaudē, samazinot izmaksas.

CALayer izmantošana zīmēšanas optimizācijai. CALayer ir viegls objekts, kas pārvalda vizuālo saturu, bet neapstrādā notikumus. Slāņu zīmēšana bieži notiek ārpus galvenās pavediena, kas uzlabo veiktspēju. Slāņa īpašības, piemēram, opacity, transform un backgroundColor, var tikt animētas bez nepieciešamības pārkrāsot visu skatījumu hierarhiju.

Minimizēt pārkrāsošanas zonu. iOS sistēma cenšas pārkrāsot tikai to ekrāna daļu, kas ir mainījusies. Tomēr, ja setNeedsDisplay() izsaukums ir uz skatījuma, kas aptver lielāku platību vai ir necaurspīdīgs, sistēma var būt spiesta pārkrāsot lielāku ekrāna daļu. Jācenšas izsaukt setNeedsDisplay() uz mazāko iespējamo skatījumu, kas patiešām jāatjaunina.

Aizkavēta satura ielāde. Ja skatījumā ir daudz satura (piemēram, garš saraksts UITableView vai UICollectionView), nevajadzētu uzreiz zīmēt visu saturu. Tā vietā, ielādējiet un attēlojiet saturu pēc tā parādīšanās ekrānā (on-demand). Tas ievērojami samazina slodzi sistēmai sākotnējās ielādes un ritināšanas laikā.

Kopēšanas izmantošana. Ja noteiktas daļas zīmēšana aizņem daudz laika un tā retāk mainās, var saglabāt zīmēšanas rezultātu kešā (piemēram, kā UIImage). Nākamajās zīmēšanas reizēs vienkārši izmantojiet kešā saglabāto attēlu vietā atkārtotu zīmēšanu.

Piemērs, izmantojot setNeedsDisplay():

class MyView: UIView {
    override func draw(_ rect: CGRect) {
        // Zīmēšanas kods
    }

    func updateContent() {
        // Datu izmaiņas, kas ietekmē zīmēšanu
        setNeedsDisplay() // Plānot pārkrāsošanu
    }
}

Piemērs, izmantojot 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:) nav īstenots")
    }

    override func layoutSubviews() {
        super.layoutSubviews()
        // Subview rāmja atjaunināšana
        subview.frame = bounds.insetBy(dx: 10, dy: 10)
    }

    func rearrangeSubviews() {
        // Subview izkārtojuma maiņa
        setNeedsLayout() // Plānot izkārtojuma atjaunināšanu
    }
}