Geon

Modern Concurrency Deep Dive(13) 본문

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
   
 }
 
}