TMDB OpenAPI를 사용하는 중에
response에 있는 id List값을 이용해 details 정보를 재조회를 해야하는 케이스가 생겼습니다.
id List는 array이기 때문에 details 값을 재조회 하는 API call이 async로 동작하지 않더라고요
그래서 찾아보니 Future.forEach() 구문을 사용하면 된다는 내용을 보고 바로 적용해봤습니다.
저와 같이 중복으로 함수 호출을 하는 경우에 async로 동작이 되어야 하거나
그와 유사하게 호출 순서가 보장되어야 하는 경우 사용하면 좋을것 같아 공유합니다.
Future.forEach() 기본적은 사용법은 아래와 같으며,
void main() async {
final items = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
await Future.forEach(items, (item) async {
print(item);
await Future.delayed(const Duration(seconds: 1));
});
}
제가 실제로 적용했던 코드는 다음과 같습니다.
TMDB의 result 값 중 TV의 season 정보를 각각의 콘텐츠로 조회하는 로직입니다.
calcResult(resultList) async {
tmdbResults.clear();
await Future.forEach(resultList, (dynamic result) async {
if (result['media_type'] != 'tv') {
tmdbResults.add(result);
} else {
// TMDB API, TV의 details 조회
Map details = await _tmdb.v3.tv.getDetails(result['id'], language: 'ko');
List seasons = details['seasons'];
if (seasons.length == 1) {
tmdbResults.add(result);
} else {
await Future.forEach(seasons, (dynamic season) async {
int _seasonId = season['id'];
int _seasonNumber = season['season_number'];
dynamic newResult = Map.from(result);
newResult['air_date'] = season['air_date'];
newResult['poster_path'] = season['poster_path'];
newResult['season_number'] = season['season_number'];
if (season['overview'] != '') {
newResult['overview'] = season['overview'];
}
tmdbResults.add(newResult);
});
}
}
});
}
끝으로 세상의 수많은 콘텐츠를 관리할 수 있는 앱을 소개할까 해요.
(제가 개발하고 있는 앱입니다. 혹시 함께 개발하고 싶은 분이 계시다면 누구든 환영입니다 ㅋㅋ)
여러분은 왕좌의 게임이나 워킹데드 좋아하시나요?
제가 제일 좋아하는 미드 중 하나인데요 오랜만에 새로운 시즌이 나오면 어디까지 봤는지 항상 헷갈리더라고요
그런데 아래 앱을 쓰면 어떤 시즌의 몇화까지 봤는지 한눈에 확인할 수 있어서 좋더라고요.
기능이 많진 않지만 영화/드라마를 관리하기엔 딱 인것 같아서 소개드려요
피클: 영화, 애니, 한드, 미드, 일드 콘텐츠 관리앱
Android : https://play.google.com/store/apps/details?id=com.jcdonald.pickle