iOS developer essential skills/Modern Concurency
Modern Concurrency Deep Dive(13)
jgkim1008
2024. 11. 26. 23:27
TaskGroup Cancel
- 취소 전파 가능하다.
- 내부적으로 취소를 어떻게 처리할지는 구현자의 몫
- nil로 처리후 넘어갈지, 취소처리 할지 구현가능하다.
func groupFunction() async -> [UIImage] {
try await withThrowingTaskGroup(of: UIImage?.self) { group in
var result: [UIImage] = []
for 1..<100 {
let image = try? await someAsyncFunction() // cancel시 nil 로 에러처리후 취소되지 않고 진행
// let image = try await someAsnycFunction() // cancel시 taskStop됨
return image
}
for try await image in group {
if let image = image {
result.append(image)
}
}
}
return result
}
func someAsyncFunction() asnyc throws -> UIImage {
do {
let (data, _) = try await URLSession.shared.data(from: url)
guard let image = UIImage(data: data) else {
throw ImageError
}
return image
} catch {
if let error = error as? URLError, error.code == .cancelled {
throw cancelErorr
} else {
throw URLError
}
}