-
Notifications
You must be signed in to change notification settings - Fork 1
♺ Swift Concurrency
Tltlbo edited this page Dec 2, 2024
·
1 revision
두 API 모두 동시성 프로그래밍을 위해 사용되는 기술이다. GCD가 먼저 만들어지고 Swift Concurrency가 그 이후에 나오게 되었다.
호출한 함수를 비동기로 작업을 수행하고 탈출 클로저를 통한 작업이 끝났을 때의 처리 진행
async
, await
을 통한 가독성이 좋은 코드를 작성하고자 도입된 개념.
위의 링크에는 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은 데이터 전달만 도맡을 수 있게 만들 수 있게 됩니다.
- 📒 기획의 과정과 의도
- 📒 swift6 도입기 ‐ @unchecked Sendable을 사용해야만 했던 이유
- 📒 WaveForm(파형) 제작기
- 📒 프로젝트 구조와 이유
- 📒 화면 전환(Game NavigationController)
- 📒 DIContainer를 사용한 계기
- 📒 AudioHelper 제작기
- 📒 음악 플레이어의 compact 버전 제작기
- 📒 Combine을 이용한 데이터 전달
- 📒 파이어베이스를 쓰며 있었던 일
- 📒 캐싱 모듈 구현과 문제점
- 📒 로그 시스템 제작기
- ❗ Data 끼리의 비교
- ❗ 프레임워크 Reference 안잡히는 문제
- ❗ actor 안에서 timer가 실행되지 않는 문제
- ❗ NSLayoutConstraint 옵셔널 문제
- ❗ 테이블 뷰가 보고 있는 배열과 bind하고 있는 배열 간의 race condition 문제
- ❗ 테스트끼리의 독립성
- ❗ 네트워크 테스팅 시 Error 핸들링
- ❗ 여러 클라이언트가 서버에 동시 요청시, 데이터가 반영이 안되는 이슈 해결
- ❗ 의존성 framework 추가시 불러오지 못하는 문제
- ❗ Timer를 6초 설정해도 더 실행되는 문제
- ❗ Music Kit Data Request 에러
- ❗ DI Container 에서 생성한 인스턴스가 동시에 존재 하는 이슈