Trouble Shooting

같은 api 통신을 여러번 반복해서 다수의 데이터를 가져오고 싶을 때

나른한코딩 2022. 5. 10. 01:03

Trouble

여러 지역의 날짜 정보를 같은 fetchWeatherInfo(woeid: ) 라는 메서드를 반복 실행하여 데이터를 가져오고 싶었다.

그리고 모든 지역의 날짜 정보를 모두 fetch 완료 하였을 때 tableView를 갱신해주고 싶었다.

 

 

 

 

Shooting

지역 정보가 들어있는 locations 배열을 순회하며

dispatchGroup 을 사용하여 날씨정보를 fetch 해오는 메서드를 group에 담는다.

group 안에 있는 메서드를 순차적으로 수행하며 모든 데이터를 fetch 해온 후 main queue에 알리고(notify)

로딩화면을 멈춘 후 tableView를 갱신해주었다.

 

  func fetchData(locations: [Location]) {
    let dispatchGroup = DispatchGroup()
    
    locations.forEach {
      dispatchGroup.enter()
      self.apiService.fetchWeatherInfo(woeid: $0.woeid) { code, data in
        self.weatherList.append([data[0], data[1]])
        
        DispatchQueue.main.async {
          dispatchGroup.leave()
        }
      }
    }
    
    dispatchGroup.notify(queue: .main) {
      self.stopLoading() // 데이터를 가져오는 동안 UX 개선을 위해 보여주던 로딩화면을 멈추는 코드
      self.homeView.tableView.scroll(to: .top, animated: true)
      self.homeView.tableView.reloadData()
    }
  }

 

 

 

 

 

결과

multiple api communications by using dispatchgroup

 

 

프로젝트 보러가기!

 

 

 

 

반응형