작업 (Task)

프로그램의 일부로 비동기적으로 실행할 수 있는 단위

TaskGroup

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

Task Groups in Swift explained with code examples