작업 내용: 단어 목록에서 검색/필터링 기능 추가.
func filterVocabularies(by keyword: String) {
let filtered = vocabularies.value.filter {
$0.name.contains(keyword) || $0.tag.contains(keyword)
}
vocabularies.accept(filtered)
}
설명:
검색 키워드나 태그를 기반으로 필터링된 단어 목록을 반환.
필터링된 데이터를 BehaviorRelay에 업데이트하여 UI에 반영.
작업 내용: 데이터를 가져오는 동안 로딩 인디케이터 표시.
간단한 로딩 상태 처리:
let isLoading = BehaviorRelay<Bool>(value: false)
func fetchVocabulary() {
isLoading.accept(true)
// 데이터 가져오기 로직...
isLoading.accept(false)
}
설명:
isLoading 상태를 BehaviorRelay로 관리.
ViewController에서 로딩 인디케이터를 표시/숨김 처리.
작업 내용: 암기된 단어와 전체 단어 수를 기반으로 진행도를 계산.
var progress: Observable<Float> {
return vocabularies.map { vocabList in
let memorizedCount = vocabList.filter { $0.didMemorize }.count
return Float(memorizedCount) / Float(vocabList.count)
}
}
설명:
ViewModel에서 진행도를 계산해 ProgressBar와 연결.
단어 암기 상태 변경 시 진행도가 실시간 업데이트.
작업 내용: 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)
}
설명:
단어 암기 상태를 변경하는 로직이 의도대로 작동하는지 검증.