async와await

작성일

Swift 5.5에서 출시된 새로운 기술이라고 하는데 쉬운데 어렵다.
일단 느낌이 잘 안온다고 해야하나? 음… 비동기함수를 사용할떄 사용한다고한다.
대표적인 예제를 보자

func fetchThumbnail(for id: String) async throws -> UIImage {
	// (1)
	let request = thumbnailURLRequest(for: id)
	// (2)
	let (data, response) = try await URLSession.shared.data(for: request)
	guard (response as? HTTPURLResponse)?.statusCode == 200 else { throw FetchError.badID }
	// (3)
	let maybeImage = UIImage(data: data)
	// (4)
	guard let thumbnail = await maybeImage?.thumbnail else { throw FetchError.badImage }
	return thumbnail
}

일단 한번 보자, 에러가 발생할 수 있으니, throws로 던져주자 그러면 사용할땐 이렇게

Task {
  do {
    let image:UIImage = try await fetchThumbnail(for: "image")
  } catch {
    print("에러발생")
  }
}

이런식으로 작성할 수 있다.

다른 방식으로는

func loadWebResource(_ path: String) async throws -> Resource
func decodeImage(_ r1: Resource, _ r2: Resource) async throws -> Image
func dewarpAndCleanupImage(_ i : Image) async throws -> Image

func processImageData() async throws -> Image {
  let dataResource  = try await loadWebResource("dataprofile.txt")
  let imageResource = try await loadWebResource("imagedata.dat")
  let imageTmp      = try await decodeImage(dataResource, imageResource)
  let imageResult   = try await dewarpAndCleanupImage(imageTmp)
  return imageResult
}

이런식으로 작성이 가능하기도 하다. 방식은
completion을 return으로 바꾸고,
메소드에 async 키워드 추가후,
사용하는 쪽에서 await와 함께 호출해준다.
그후 Task와 함께 사용해 주면 된다.

override func viewDidLoad() {
    super.viewDidLoad()
    Task {
        await self.process() 
     }
}