Skip to content

♺ Swift Concurrency

Tltlbo edited this page Dec 2, 2024 · 1 revision

GCD와 Swift Concurrency

두 API 모두 동시성 프로그래밍을 위해 사용되는 기술이다. GCD가 먼저 만들어지고 Swift Concurrency가 그 이후에 나오게 되었다.

GCD

호출한 함수를 비동기로 작업을 수행하고 탈출 클로저를 통한 작업이 끝났을 때의 처리 진행

Swift Concurrency

async, await 을 통한 가독성이 좋은 코드를 작성하고자 도입된 개념.

왜 도입 되었는가? - 가독성

https://github.com/apple/swift-evolution/blob/main/proposals/0296-async-await.md#problem-1-pyramid-of-doom

위의 링크에는 GCD로 작성된 코드로 코드가 깊어지면 깊어질수록 들여쓰기가 너무 많아져 가독성이 너무 저하된다는 내용이 작성되어 있습니다.

func GCDTest(completion: (_ result: Image) -> Void) {
	test1() { test1 in
		test2() { test2 in
			test3() { test3 in
				test4() { test4 in
					completion(test4)
				}
			}
		}
	}
}

이런식으로 completion Handler가 깊어짐에 따라 가독성이 너무 안좋아지는 문제가 생겼습니다.

func ConcurrencyTest() async throws -> Image {
	let test1 = await test1()
	let test2 = await test2()
	let test3 = await test3()
	let test4 = await test4()
	
	return test4
}

순식간에 들여쓰기가 사라지고 가독성이 좋은 코드가 된 모습을 볼 수 있습니다.

왜 도입 되었는가? - 에러 핸들링 안전성

GCD에서는 에러 발생 시, 보통 completionHandler에 값과 에러 정보를 보내주게 되는데 값을 비우고 에러만 담아 보내게 된다.

func ErrorGCD(completion: @escaping (UIImage?, Error?) -> Void) {
	...
	guard let data = data else {
		completion(nil, TestError.invalidData)
	}
	let image = UIImage(data: data)
	completion(image, nil)
}

이런식으로 에러를 일일히 completion으로 처리 해주어야 한다는 단점이 있었습니다.

func ErrorConcurrency() async throws -> UIImage {
	let (data, error) = try await fetchData()
	
	guard let image = UIImage(data: data) else {
		throw TestError.invalidData
	}
	
	return image
}

이런 식으로 에러 핸들링은 throw가 모두 도맡고, return은 데이터 전달만 도맡을 수 있게 만들 수 있게 됩니다.

iOS07 프로젝트 일지

📚 문서

🫶🏻 팀 기록

🎤 프로젝트

💡 핵심 경험

🚨 트러블 슈팅

📔 학습 정리

🪄 QA

Clone this wiki locally