Swift Concurrency가 해결하고자 한 문제는 어떻게 보면 되게 간단하다 동시에 여러 스레드가 같은 데이터를 건드려도 안전하게 동작해야한다! 라는 점, 즉 Thread-Safety 문제를 해결하기 위함이다. 기존의 GCD를 활용했을때 문제점은DispatchQueue.global().async { myData.value += 1}이 코드가 여러 스레드에서 동시에 실행되면 하나의 value에 여러 스레드가 동시에 접근하고, 그 결과로 데이터 경합 (Race Condition)이 발생하게 된다. 이런 문제를 막기위해서는 락(NSLock)을 사용하던지, 세마포어, 시리얼큐 등 직접 안정성을 관리했어야 했던점이 불필요한 작업들도 많이 들고 비효율적이었다. 이러한 개념을 좀 해결하기 위해서 Swift C..
먼저 프로퍼티 래퍼가 나오게 된 이유에 대해서 설명해보면 프로퍼티 래퍼는 SwiftUI로 넘어오면서 자주 사용하게 되는 개념인데 말 그대로 프로퍼티를 감싸주는 요소라고 생각하면 된다. 프로퍼티 래퍼우리가 상태 추적을 위해 사용하던 State, Binding 등 프로퍼티 래퍼를 사용해 왔다 이 프로퍼티 래퍼는 왜 사용하게 됐을까먼저 프로퍼티 래퍼 안쪽을 살펴보면 프로퍼티의 반복적인 계산 속성을 하나의 프로퍼티 래퍼로 만들어 중복 로직을 작성하지 않고 사용할 수 있게 해주는 개념이다!struct User { private var _name: String = "" var name: String { get { _name.capitalized } set { _name = new..
앞서 알아본 Concurrency는 async/await와 Task 기반의 동시성을 제공한다. 동시에 여러 일을 수행할 수 있게 되면서 중요한 문제가 생기는데 바로 바로 더 이상 필요 없는 일을 어떻게 중단하게 할건지? 에 대한 내용!! 예를 들어 사용자가 어떤 작업을 입력했는데 곧바로 해당 작업을 변경한다면 이전의 요청은 필요없어지게 된다거나, 화면을 떠났는데 여전히 해당 작업이 진행되게 된다면 불필요한 리소스를 낭비하게 된다. 이러한 점을 컨트롤하기 위해 Swift Concurrency에서는 어떤 작업 취소가 가능한지 한번 알아보도록 하자! 협력적 취소(Cooperative Cancellation)Swift Concurrency의 취소는 강제로 멈춘다의 개념이 아닌 단순히 작업에 깃발을 꽂아두는 것!..
구조적 동시성은 부모-자식 작업 계층을 명시적으로 만드는 모델이다. 부모가 만든 자식들은 일반적으로 병렬로 실행되게 되고, 부모가 끝나기 전에 자식이 모두 끝나도록 보장된다. 이 덕분에 아래와 같은 두가지 특징이 생긴다!작업 수명 (Lifecycle)이 스코프로 묶여 메모리/자원 누수 가능성이 줄고취소 전파와 우선순위 상속 등 런타임이 제공하는 안전장치를 자연스럽게 활용할 수 있다.여기서 Swift에서는 구조적 동시성을 위해 두가지를 제공한다!async letTaskGroup / withThrowingTaskGroup핵심 개념에 대해서 특징 별로 한줄로 요약하면 다음과 같다.병렬 실행 : 자식 작업은 기본적으로 병렬로 동작한다.스코프 보장 : 부모 스코프가 끝나기 전에 자식이 반드시 완료된다.취소 전파 ..
오늘은 Swift Concurrency 중에서 Continuation 사용과 sleep의 차이에 대해 알아보자. Continuation먼저 Continuation은 콜백/델리게이트 기반의 비동기 API를 async/await 을 활용할 수 있도록 연결해주는 도구이다. 새로운 동시성 모델을 사용하고 싶은데 당장 구현했던 SDK 혹은 라이브러리가 콜백만 제공하는 구조라면 이럴 때 Continuation을 활용해 래핑해 사용하면 된다는 것! Swift Concurrency에서 async/await는 읽기 쉽고 오류에 강한 비동기 코드를 작성할 수 있게 해준다 이러한 장점 덕분에 많은 부분에서 컨커런시로 전환하고 있지만, 실제로 라이브러리 혹은 SDK를 사용하면 completion handler나 delegat..
비동기의 구체적인 개념에 대해서 Swift Concurrecy를 사용하면서 내가 생각했던 개념에 대해 다시 짚어봐야할 내용이 있는 것 같아 한번 알아보려고 한다. 이전에 Swift Concurrecy를 사용하기 전에 비동기 처리는 GCD의 DispatchQueue.main.async {} 이런 식으로 사용해서 이 일을 메인스레드에 맡겨 실행하고 나는 기다리지 않겠다 정도의 의미였다. 핵심은 작업을 큐에 넣고 끝이라는 것, 이 실행이 언제 끝나는지는 모르고, 끝났다는 알림을 받고 싶다면 completion handler 같은 콜백을 추가하여 붙여야 했다. 즉 정리하자면, 내가 일을 시키고 기다리지 않는다! 라는 개념으로 실행을 위임하는 단순한 개념이었다. Swift Concurrecy에서 비동기는 단순히 ..