[swift] Swift DeepDiff를 활용하여 테이블뷰에서 셀 높이 최적화하기

테이블뷰를 사용하는 앱에서는 각 셀의 높이를 최적화하는 것이 성능 향상에 중요합니다. 테이블뷰에 새로운 데이터가 추가될 때마다 전체 테이블뷰를 다시 그리는 것은 비효율적이기 때문에, 변경된 데이터만 화면에 업데이트하는 것이 필요합니다.

Swift에서는 DeepDiff라는 라이브러리를 사용하여 변경된 데이터를 감지하고 테이블뷰의 셀 높이를 최적화할 수 있습니다.

DeepDiff 라이브러리 설치하기

먼저, DeepDiff를 프로젝트에 추가해야 합니다. CocoaPods를 사용하는 경우, Podfile에 다음과 같이 추가합니다:

pod 'DeepDiff'

그런 다음 터미널에서 pod install 명령어를 실행하여 라이브러리를 설치합니다.

변경된 데이터 감지하기

테이블뷰에서 셀의 높이를 최적화하기 위해서는 변경된 데이터를 감지해야 합니다. DeepDiff는 이를 가능하게 하기 위한 기능을 제공합니다.

먼저, 테이블뷰에 데이터를 로드하는 방식에 따라서 변경된 데이터를 감지하는 방법이 달라집니다. 여기에서는 가장 간단한 방법으로 예시를 보여드리겠습니다.

먼저, 데이터 모델을 정의해봅시다. 예를 들어, Person 모델을 갖는 people 배열이 있다고 가정해보겠습니다.

struct Person: Equatable {
    let name: String
    let age: Int
}

테이블뷰에서 데이터를 업데이트하거나 셀을 그릴 때, people 배열이 변경되어야 할 경우, DeepDiff를 사용하여 변경된 데이터를 감지할 수 있습니다. 다음은 UITableViewDataSource 프로토콜을 구현하는 예시입니다:

import DeepDiff

class ViewController: UIViewController, UITableViewDataSource {

    var people: [Person] = []
    
    // 테이블뷰 데이터 업데이트
    func updatePeople(newPeople: [Person]) {
        let changes = diff(old: people, new: newPeople)
        tableView.reload(changes: changes, updateData: {
            self.people = newPeople
        })
    }

    // 테이블뷰 DataSource 프로토콜 구현
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return people.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
        let person = people[indexPath.row]
        cell.textLabel?.text = person.name
        cell.detailTextLabel?.text = "\(person.age) years old"
        return cell
    }
    
    // ... (다른 UITableViewDataSource 메서드들)
}

위의 예시 코드에서 updatePeople() 메서드는 변경된 데이터를 감지하여 테이블뷰를 업데이트합니다. diff(old:new:) 함수를 사용하여 이전 데이터와 새로운 데이터를 비교하고 변경된 부분을 찾아냅니다. 그런 다음 reload(changes:updateData:) 메서드를 호출하여 변경된 데이터를 업데이트합니다.

셀 높이 계산하기

테이블뷰에서 셀의 높이를 동적으로 계산해야 하는 경우가 있습니다. 예를 들어, 셀 내용에 따라 높이가 가변적으로 변하는 경우입니다.

셀 높이를 계산하기 위해서는 UITableViewDelegatetableView(_:heightForRowAt:) 메서드를 구현해야 합니다. DeepDiff를 사용하여 변경된 데이터를 감지한 후, 변경된 데이터를 업데이트할 때마다 tableView(_:heightForRowAt:) 메서드를 호출하여 셀 높이를 계산할 수 있습니다.

extension ViewController: UITableViewDelegate {
    
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        let person = people[indexPath.row]
        // 셀의 높이 계산 방법을 구현합니다.
        // 예시:
        let nameHeight = person.name.boundingRect(with: CGSize(width: tableView.bounds.width, height: .greatestFiniteMagnitude), options: [.usesLineFragmentOrigin], attributes: [.font: UIFont.systemFont(ofSize: 17)], context: nil).height
        let ageHeight = person.age.description.boundingRect(with: CGSize(width: tableView.bounds.width, height: .greatestFiniteMagnitude), options: [.usesLineFragmentOrigin], attributes: [.font: UIFont.systemFont(ofSize: 15)], context: nil).height
        let totalHeight = nameHeight + ageHeight + 20 // 여백 포함
        return totalHeight
    }
}

위의 예시 코드에서는 person 객체의 nameage를 기준으로 셀의 높이를 계산한 후 반환합니다. 적절한 높이 계산 방식은 앱의 특정 요구에 따라 달라질 수 있으므로 필요에 따라 수정하여 사용하셔야 합니다.

이제 DeepDiff를 사용하여 변경된 데이터를 감지하고 테이블뷰의 셀 높이를 최적화하는 방법을 알게 되었습니다. 이를 활용하여 앱의 테이블뷰 성능을 향상시킬 수 있습니다.

참고 자료