Sobes.tech
Middle+

Реци о оптимизацији коришћења инвалидирања у iOS развоју.

sobes.tech АИ

Одговор од АИ

Користење setNeedsDisplay() и setNeedsLayout(). setNeedsDisplay() планира повторно цртање на прегледот, додека setNeedsLayout() планира ажурирање на распоредот на прегледите. И двете функции не ги извршуваат ажурирањата веднаш, туку ги ставаат во ред за следната циклус на ажурирање на корисничкиот интерфејс. Ова им овозможува на системите да обединат повеќе барања за ажурирање во еден премин, намалувајќи ги трошоците.

Користење на CALayer за оптимизација на цртањето. CALayer е лесен објект кој управува со визуелното содржина, но не обработува настани. Цртањето на слоевите често се случува надвор од главната низа, што ја подобрува перформансата. својствата на слојот, како opacity, transform и backgroundColor, можат да се анимираат без потреба од повторно цртање на целата хиерархија на прегледите.

Минимизирање на зоните за повторно цртање. iOS системот се стреми да црта само оној дел од екранот кој се промени. Меѓутоа, ако повикот setNeedsDisplay() е на преглед кој покрива поголема област или е непрозрачен, системот може да биде принуден да црта поголем дел од екранот. Треба да се стремиме да повикуваме setNeedsDisplay() на најмалиот можен преглед кој навистина треба да се ажурира.

Одложено вчитување на содржината. Ако прегледот содржи многу содржина (на пример, долг список во UITableView или UICollectionView), не треба да цртаме целата содржина одеднаш. Наместо тоа, вчитувајте и прикажувајте содржина по потреба, како што се појавува на екранот (on-demand). Ова значително ќе ја намали оптовареноста на системот при почетното вчитување и скролување.

Користење на кеширање. Ако цртањето на одреден дел од прегледот одзема многу време и тој ретко се менува, можете да кеширате резултат од цртањето (на пример, како 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:) has not been implemented")
    }

    override func layoutSubviews() {
        super.layoutSubviews()
        // Ажурирање на рамката на subview
        subview.frame = bounds.insetBy(dx: 10, dy: 10)
    }

    func rearrangeSubviews() {
        // Промена на распоредот на subview
        setNeedsLayout() // Планирање на повторно распоредување
    }
}