티스토리 뷰

func getImage(completion: @escaping (UIImage?) -> Void) {
	// 이미지를 가져오는 코드
	completion(nil)
}

getImage { [weak self] image in
	self?.artworkImageView.image = image
}

위와 같은 코드가 있다고 생각해봅시다. 이 코드를 하위호환성을 유지하면서 Async, Await도 사용하기 위해 어떤 식으로 코드를 작성해야할까요? 해답은 Xcode의 Refactor에 있었습니다.

Refactor → Add Async Wrapper

Add Async Wrapper를 선택하게 되면 위의 코드를 아래와 같이 변경해줍니다.

@available(*, renamed: "getImage()")
func getImage(completion: @escaping (UIImage?) -> Void) {
	completion(nil)
}

func getImage() async -> UIImage? {
	return await withCheckedContinuation { continuation in
		getImage() { result in
			continuation.resume(returning: result)
		}
	}
}

// 사용
let image: UIImage? = await getImage()

앞으로 더 편하게 Async, Await 코드로 변경할 수 있게 되었습니다! 만약 Add Async Alternative를 선택할 경우 아래와 같이 나타납니다.

@available(*, renamed: "getImage()")
func getImage(completion: @escaping (UIImage?) -> Void) {
	Task {
		let result = await getImage()
		completion(result)
	}
}


func getImage() async -> UIImage? {
	return nil
}

참고 자료

최근에 올라온 글
최근에 달린 댓글
글 보관함
Total
Today
Yesterday