Tái sử dụng cell với dequeueReusableCellWithIdentifier:
swift
57
White

Kaopiz Software Co., Ltd. viết ngày 30/01/2019

Trong lập trình iOS phải thường xuyên sử dụng các loại ScrollView như TableView, CollectionView. Chúng cho phép load các cell từ storyboard và sử dụng cell qua việc implement phương thức tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell đối với Tableview và collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell đối với CollectionView.

dequeueReusableCellWithIdentifier:

dequeueReusableCellWithIdentifier trả về một đối tượng table-view cell được định vị bởi identify của nó. Khi muốn reuse
cell trong tableview ta sử dụng tableView.dequeueReusableCell<Identifier: ReuseIdentifierType>(withIdentifier identifier: Identifier, for indexPath: IndexPath) Khi đó tableView sẽ reuse các cell được gán định danh Identifier tránh việc phải sinh ra nhiều cell mới giúp tiết kiệm tài nguyên của máy.

So sánh

Chúng ta sẽ đi so sánh performance khi sử dụng reuse và không resuse cell. Với số lượng cell nhỏ thì sẽ không thành vấn đề nhưng thử với khoảng 1000 cell ta sẽ thấy rõ được sự khác biệt

Không reuse cell

Trước tiên tạo một custom cell là ResuseTableViewCell trắng chỉ chứa một UILabel.
Tạo 1000 cell mới có kiểu là ResuseTableViewCell qua hàm setupCell()

class BadTableViewController: UITableViewController {
    var cells = [ReuseTableViewCell]()

    override func viewDidLoad() {
        super.viewDidLoad()
        title = "Bad"
        tableView.estimatedRowHeight = 50
        setupCell()
    }

    // MARK: - Table view data source

    override func numberOfSections(in tableView: UITableView) -> Int {
        // #warning Incomplete implementation, return the number of sections
        return 1
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        // #warning Incomplete implementation, return the number of rows
        return cells.count
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = cells[indexPath.row]
        cell.index.text = "\(indexPath.row)"
        return cell
    }

    func setupCell() {
        for _ in 0 ... 1000 {
            let cell = Bundle.main.loadNibNamed("ReuseTableViewCell", owner: self, options: nil)?[0] as! ReuseTableViewCell
            cells.append(cell)
        }
    }
}

Cùng xem lượng tài nguyên mà bị chiếm như thế nào nhé
alt text

Reuse cell

Khi sử Reuse cell trước tiên ta phải đăng kí cell đó với một định danh qua hàm
register(_ nib: UINib?, forCellReuseIdentifier identifier: String)

class ReuseCellTableViewController: UITableViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        title = "Reuse"
        tableView.estimatedRowHeight = 50
        let nib = UINib(nibName: "ReuseTableViewCell", bundle: Bundle.main)
        tableView.register(nib, forCellReuseIdentifier: "reuseTableViewCell")
    }

    // MARK: - Table view data source

    override func numberOfSections(in tableView: UITableView) -> Int {
        // #warning Incomplete implementation, return the number of sections
        return 1
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        // #warning Incomplete implementation, return the number of rows
        return 1000
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "reuseTableViewCell", for: indexPath) as! ReuseTableViewCell
        cell.index.text = "\(indexPath.row)"
        return cell
    }
}

Cùng xem kết quả khi load 1000 cell như thế nào nhé

alt text

Kết quả

Việc reuse cell giúp ta tiết kiệm rất nhiều tài nguyên và cải thiện performance cho ứng dụng khi mà hiện tại việc tiết kiệm tài nguyên và tăng performance cho ứng dụng trên mobile luôn là một thứ đau đầu.

Bài viết này được trích dẫn từ blog nội bộ công ty KAOPIZ - カオピーズ
Bài gốc: http://kipalog.kaopiz.com/posts/pUYNCo1n9vdseeGNuLJUzQ

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Kaopiz Software Co., Ltd.

27 bài viết.
25 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
51 2
Bài viết này được trích dẫn từ blog nội bộ công ty (Link) (Link) Bài gốc: https://kipalog.kaopiz.com/posts/RegexHocroimanhuchuahoc (Ảnh) 1. Tự...
Kaopiz Software Co., Ltd. viết gần 2 năm trước
51 2
White
7 0
Mở Đầu Chắc hẳn là dev ai cũng từng nghe qua về Docker và Virtual Machine (VBox hoặc Vmware). Docker giúp cho việc xây dựng và triển khai một môi ...
Kaopiz Software Co., Ltd. viết gần 2 năm trước
7 0
White
6 0
Introduction Elasticsearch là một công cụ tìm kiếm dựa trên nền tảng Apache Lucene. Nó cung cấp một bộ máy tìm kiếm dạng phân tán, có đầy đủ công ...
Kaopiz Software Co., Ltd. viết gần 2 năm trước
6 0
Bài viết liên quan
White
14 4
(Link) (Link) (Link) Ở 2 phần tut trước, mình đã hướng dẫn khá chi tiết cách viết một ứng dụng camera có tích hợp chức năng nhận diện khuôn mặ...
HoangPH viết hơn 5 năm trước
14 4
White
2 0
Có nhiều cách viết blog công nghệ hơn là làm bánh hay làm tình. Những ngày này Hà Nội mưa liên miên, được cái mát giời, mình lại tức cảnh sinh tìn...
VietHQ viết 3 năm trước
2 0
White
0 0
Swift là ngôn ngữ do Apple tạo ra và nhận được sử ủng hộ lớn từ cộng đồng. Nhất là từ khi nó opensource. Bản thân ngôn ngữ vẫn đang ngày một hoàn t...
VietHQ viết gần 2 năm trước
0 0
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
27 bài viết.
25 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!