0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

ちょこっと StackView のパフォーマンスを気にしてあげる

Posted at

今回は StackView で限定された数のリストを繰り返し更新して表示する際に、ちょこっとパフォーマンスが良くなる方法を紹介したいと思います。

UITableViewCell に StackView を持っている時の実装を行っていきます。

    @IBOutlet private weak var stackView: UIStackView!

    private let displayLimit = 3

    override func awakeFromNib() {
        super.awakeFromNib()
        for _ in 1...displayLimit { stackView.addArrangedSubview(CustomeView()) }
    }

これで、初期化時に StackView に CustomeView() が3つ追加されるようになります。
次に Cell を更新するためのメソッドを書いていきます。

    @IBOutlet private weak var stackView: UIStackView!

    private let displayLimit = 3

    override func awakeFromNib() {
        super.awakeFromNib()
        for _ in 1...displayLimit { stackView.addArrangedSubview(CustomeView()) }
    }

    func set(list: [CustomeViewData]) {
        for (index, subview) in stackView.subviews.enumerated() {
            if let customeView = subview as? CustomeView, let data = list[safe: index] {
                subview.isHidden = false
                customeView.iconImage = data.iconImage
                customeView.name = data.name
            } else {
                subview.isHidden = true
            }
        }
    }

これで、List に含まれるデータに応じて StackView を可変に変更できるようになりました🎉

更新頻度が極めて少ない View などで使用する場合や StackView の階層が1つの場合は、その都度 StackView をリセットし、addArrangedSubview をしてもほとんど問題はありませんが、更新頻度が高い場合などは今回のように中身だけ更新できるようにすることで、StackView の AutoLayout による遅延が最小ですむのでパフォーマンスコストを削減できそうですね。また、今回はリミットを3件のみに限定しているため SubView を全て更新していますが、差分のみを更新できるようにするとさらに良さそうです。

参考

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?