Skip to content

산 목록 검색

MINRYUL edited this page Nov 11, 2021 · 5 revisions

산 목록 검색할때 입력이 느려지는 현상

저자: S009_김민창

  • 너무 느리다...

시나리오

  1. 산 목록 화면에 들어간다.
  2. 산 목록 검색 기능을 사용한다.
  3. 한글자 한글자 검색할 때마다 입력이 느려짐.


추측1: 검색기능을 사용할때 한글자 한글자를 쓸 때마다 산 900개를 모두 검색해서 느린가??

  • 맞는 것 같음 그러면 이미 진행중인 Task를 지우고 다시 진행하면 되지 않을까?
  • 일단 동기적으로 진행되는 것이라 Task를 지우고 다시 실행할 수 없음


해결법1: 그럼 비동기로 하면 되지?

  • 비동기로 해도 글자 하나 마다 로직이 실행됨. 똑같이 오버해드가 있을 수도 있다고 판단.

해결법2: 다른 조에서 디바운스를 쓴 것이 기억남

  • 디바운스를 걸면 일단 사용자가 입력이 멈췄을 때에 맞춰 검색이 가능하다고 판단.
  • 디바운스를 걸기 위해 ViewModel에 @Published var mountainName: String?를 선언하고 Controller에서 바인딩을 할 때 디바운스를 걸어주면 되겠다 판단.

extension MountainListViewController: UISearchResultsUpdating {
    func updateSearchResults(for searchController: UISearchController) {
        guard let mountainName = searchController.searchBar.text else { return }
        self.viewModel?.mountainName = mountainName
    }
}

  • searchBar의 text가 바뀔 때마다 ViewModel에 알려준다.

self.viewModel?.$mountainName
    .debounce(for: 0.7, scheduler: RunLoop.main)
    .sink { [weak self] _ in
        self?.viewModel?.findMountains()
    }
    .store(in: &subscriptions)

  • 디바운스를 0.7초 main 스레드에 걸어서 사용자가 입력을 멈추고 0.7초 뒤에 산 목록을 찾는 방식으로 진행.

func findMountains() {
    guard let name = mountainName else { return }
    self.useCase.findMountains(name: name) { [weak self] mountains in
        self?.mountains = mountains
    }
}

  • 0.7초가 지나면 산을 찾는 로직을 실행 시킴.
  • 검색 된 산 목록을 다시 snapShot을 만들어 diffable datasource에 넣으면 해결

해결



결론

  • 컴바인에는 많은 좋은 기능이 있는데 그것을 다 쓰지 못하는 느낌.. 공부가 필요하다..
Clone this wiki locally