[swift] IGListDiffKit을 사용한 데이터 스크랩핑

오늘은 IGListDiffKit을 사용하여 데이터 스크랩핑하는 방법에 대해 알아보겠습니다.

IGListDiffKit이란?

IGListDiffKit은 Instagram에서 개발한 데이터 변경 감지 도구로, UICollectionView와 같은 리스트 기반 UI에서 데이터 변경을 감지하고 효율적으로 업데이트하는 데 사용됩니다. IGListDiffKit은 데이터 변경을 비교하고 업데이트하는데 있어서 성능을 최적화해주는 많은 기능을 제공합니다.

데이터 스크랩핑을 위한 IGListDiffKit 적용

  1. 먼저, IGListDiffKit을 프로젝트에 추가합니다. Cocoapods를 사용한다면 pod 'IGListDiffKit'Podfile에 추가하고, pod install 명령을 실행하여 설치합니다.

  2. IGListDiffKit을 사용할 데이터 모델을 작성합니다. 예를 들어, 스크랩된 데이터를 담을 모델 ScrapedData를 정의합니다.

    struct ScrapedData {
        let title: String
        let description: String
        let imageURL: String
    }
    
  3. 데이터 스크랩핑 로직을 구현합니다. 데이터를 스크랩하는 함수 scrapeData를 작성합니다.

    func scrapeData() -> [ScrapedData] {
        // 데이터 스크랩핑 로직 구현
        // 스크랩된 데이터를 ScrapedData 모델에 맞게 파싱하여 배열에 담아 반환
    }
    
  4. IGListDiffable 프로토콜을 구현하여 데이터 모델을 비교할 수 있도록 만듭니다.

    extension ScrapedData: ListDiffable {
    
        func diffIdentifier() -> NSObjectProtocol {
            // 모델을 유일하게 식별하는 키를 반환합니다.
            // 주로 모델의 고유한 식별자인 ID를 사용합니다.
            return title as NSObjectProtocol
        }
    
        func isEqual(toDiffableObject object: ListDiffable?) -> Bool {
            guard let other = object as? ScrapedData else { return false }
            // 모델의 동등성을 비교하여 변경을 감지합니다.
            // 여기에서는 title, description, imageURL을 비교합니다.
            return title == other.title &&
                   description == other.description &&
                   imageURL == other.imageURL
        }
    }
    
  5. 스크랩된 데이터를 UICollectionView에 표시하는 ViewController를 구현합니다.

    class ScrapedDataViewController: UIViewController {
    
        private var data: [ScrapedData] = []
    
        func updateData() {
            let newData = scrapeData()
            let diff = ListDiffPaths(fromSection: 0, toSection: 0, oldArray: data, newArray: newData, option: .equality)
            data = newData
            collectionView.perform(updates: { (updates) in
                updates.diff(diff)
            })
        }
    
        // ... collection view 관련 코드 작성 ...
    }
    
  6. 스크랩된 데이터를 주기적으로 업데이트하고, 변경 사항을 감지하여 UI를 업데이트합니다.

    class ScrapedDataViewController: UIViewController {
    
        private var data: [ScrapedData] = []
    
        override func viewDidLoad() {
            super.viewDidLoad()
            // 타이머를 설정하여 주기적으로 데이터를 업데이트합니다.
            Timer.scheduledTimer(withTimeInterval: 60, repeats: true) { [weak self] (_) in
                self?.updateData()
            }
        }
    
        // ... 나머지 코드 ...
    }
    

이렇게 IGListDiffKit을 사용하여 데이터 스크랩핑 로직을 구현하고, 변경 사항을 감지하여 효율적으로 데이터를 업데이트할 수 있습니다.

더 자세한 내용은 IGListDiffKit의 공식 문서를 참고하시기 바랍니다. (링크)