ViewModel 확장과 데이터 바인딩 개선

버질·2025년 1월 9일

1. ViewModel 확장

작업 내용: 단어 목록에서 검색/필터링 기능 추가.

func filterVocabularies(by keyword: String) {
    let filtered = vocabularies.value.filter { 
        $0.name.contains(keyword) || $0.tag.contains(keyword)
    }
    vocabularies.accept(filtered)
}

설명:
검색 키워드나 태그를 기반으로 필터링된 단어 목록을 반환.
필터링된 데이터를 BehaviorRelay에 업데이트하여 UI에 반영.

2. UI 개선

작업 내용: 데이터를 가져오는 동안 로딩 인디케이터 표시.
간단한 로딩 상태 처리:

let isLoading = BehaviorRelay<Bool>(value: false)

func fetchVocabulary() {
    isLoading.accept(true)
    // 데이터 가져오기 로직...
    isLoading.accept(false)
}

설명:
isLoading 상태를 BehaviorRelay로 관리.
ViewController에서 로딩 인디케이터를 표시/숨김 처리.

3. 암기 진행도 표시

작업 내용: 암기된 단어와 전체 단어 수를 기반으로 진행도를 계산.

var progress: Observable<Float> {
    return vocabularies.map { vocabList in
        let memorizedCount = vocabList.filter { $0.didMemorize }.count
        return Float(memorizedCount) / Float(vocabList.count)
    }
}

설명:
ViewModel에서 진행도를 계산해 ProgressBar와 연결.
단어 암기 상태 변경 시 진행도가 실시간 업데이트.

4. 테스트 코드

작업 내용: ViewModel의 데이터 로직에 대한 단위 테스트 작성.

func testToggleMemorizeState() {
    let mockVocabulary = Vocabulary(
        definition: "Sample definition",
        details: [],
        id: 1,
        name: "Sample",
        subName: nil,
        tag: "SampleTag",
        didMemorize: false
    )
    viewModel.vocabularies.accept([mockVocabulary])
    viewModel.toggleMemorizeState(at: 0)
    XCTAssertTrue(viewModel.vocabularies.value[0].didMemorize)
}

설명:
단어 암기 상태를 변경하는 로직이 의도대로 작동하는지 검증.

profile
iOS Developer · SwiftUI & UIKit '가끔 되고 가끔 안 되는' 문제를 뿌리부터 잡습니다.

0개의 댓글