Taehyeon-Kim/Mogakco

[Feat] 스터디 입력 화면(1_2_study) 코드 정리

Taehyeon-Kim opened this issue · 4 comments

todo

  • post queue/search 연결 (스터디 목록 조회)
  • post queue 연결 (새싹 찾기)
  • 지금 주변에는 스터디 표시
    • fromRecommend, fromQueueDB, fromQueueDBRequested 배열의 studylist
    • 셀 클릭 시 내가 하고 싶은 스터디에 추가

logic

  • arounded_study 배열
  • wanted_study 배열 -> post 요청 시에 사용
  • lat, long (전체적으로 가지고 있어야 할 위치 정보 <- 이전 화면에서 전달)

design

  • cell type
    • recommend : 추천
    • arounded : 주변 새싹의
    • wanted : 내가 하고 싶은

중복 제거

extension Sequence where Element: Hashable {
    func uniqued() -> [Element] {
        var set = Set<Element>()
        return filter { set.insert($0).inserted }
    }
}

나름대로 뷰 쪽에서 로직을 짜보려고 했던 부분

  • 키워드 형태가 되게 여러가지로 오는데
  • 일단 추천 키워드
  • 그리고 Queue(주변 스터디, 요청 받은 스터디)에 들어가 있는 키워드
  • 키워드 중복 제거
  • 추천 키워드가 먼저 정렬되도록 해야 함
private func makeAroundedKeywords(with dto: SearchResponseDTO) -> [KeywordItemViewModel] {
    let fromRecommend = dto.fromRecommend.map { KeywordItemViewModel(contents: $0, keywordType: .recommended) }
    let fromQueueDB = dto.fromQueueDB.flatMap { $0.studylist.map { KeywordItemViewModel(contents: $0, keywordType: .arounded) } }
    let fromQueueDBRequested = dto.fromQueueDBRequested.flatMap { $0.studylist.map { KeywordItemViewModel(contents: $0, keywordType: .arounded) } }
    
    var results = fromRecommend + fromQueueDB + fromQueueDBRequested
    results = removeDuplicatedKeywords(items: results)
    self.items.accept([.arounded(results.map {.keyword($0)})])
    return results
}

private func removeDuplicatedKeywords(items: [KeywordItemViewModel]) -> [KeywordItemViewModel] {
    var items = items
    items.removeAll { viewModel in
        viewModel.contents == "anything" ||
        viewModel.contents.isEmpty
    }
    
    let result = Array(Set(items))
    return result.sorted { first, _ in
        return first.keywordType == .recommended
    }
}
  • RxDataSources를 쓰려고 한 부분
  • SectionModelType을 채택해서 Section에 대한 열거형 구현해준 부분
  • Cell 마다 ViewModel을 각각 가지고 있어서 내부 처리를 해주려고 한 부분

Reference

  • 이제 섹션 헤더를 어떻게 하면 될지만 고민해보면 됨