프로그램의 일부로 비동기적으로 실행할 수 있는 단위
dynamic하게 추가된 여러 task 작업의 컨테이너라고 할 수 있습니다.
자식들의 task의 경우 parallel or serial하게 동작할 수 있지만, 작업 그룹은 자식 task들이 완료된 후에 완료로 뜨게 됩니다.
for 문 내에서 몇개의 child task가 만들어질지 모르는 상황에서 대응할 수 있는 방법입니다.
우리의 경우 RandomMusic을 20개로 받기로 결정했다면 사실은
async let music = musicKitService.getMusic(with: isrc)isrc[0] 와 같이 20개를 작성해도 되지만, 이것은 추후에 수정될 가능성이 높고 하드한 작업입니다.
즉, 몇개의 child task가 생기는지 런타임 시점에 결정되는 경우에 이러한 작업을 동시적으로 불러오기 위해서 사용합니다.
return try await withThrowingTaskGroup(of: RandomMusic?.self) { group in
for isrc in isrcs {
group.addTask {
return await musicKitService.getMusic(with: isrc)
}
}
var musics: [RandomMusic] = []
for try await music in group {
if let music {
musics.append(music)
}
}
return musics
}
withThrowingTaskGroup(of:returning:isolation:body:) | Apple Developer Documentation