본문 바로가기

Swift/Concurrency

(6)
Discover Concurrency (3) - Async/await을 사용할 때 메모리 관리하기 비동기 코드 컨텍스트에서 앱의 메모리를 관리하는 것은 까다로운 작업이다. 비동기 호출이 수행되고 처리되기 위해 다양한 객체와 값이 시간이 지남에 따라 캡처되고 유지되어야 할 수 있기 때문이다. 비교적 최신 기술인 async/await 구문은 많은 종류의 비동기 작업을 더 쉽게 작성할 수 있게 해 주지만, 비동기 코드에 관련된 다양한 작업과 객체의 메모리를 관리할 때는 여전히 신중해야 한다. Implicit captures async/await 과 이를 동기 컨텍스트에서 호출하기 위하여 Task 로 래핑 하는 것의 흥미로운 점은 비동기 코드가 실행되었을 때, 어떻게 객체와 값들이 암시적으로 캡처되는 경우가 많다는 것이다. 예를 들어, DocumentViewController 에서 작업을 하고 있다고 해보자..
Discover Concurrency (2) - Asynchronous Task 지연시키기 다양한 비동기 작업에 딜레이를 추가하고 싶을 수 있다. 예를 들어, 다른 작업이 먼저 완료되기를 기다리거나 “debouncing” 작업을 추가하기 위한 것이다. Swift에서는 특정 시간 지연을 가진 Task를 직접 실행하는 내장 방법은 제공하지 않고 있지만, 특정 나노 초만큼 Task를 대기하도록 지시함으로써 이러한 동작을 구현할 수 있다. Task { // Delay the task by 1 second: try await Task.sleep(nanoseconds: 1_000_000_000) // Perform our operation ... } Task.sleep 은 다른 코드와 관련해 완전히 차단되지 않기 때문에 다른 sleep 메서드와는 다르다. 위 Task.sleep 에 try 키워드가 붙은 ..
Discover Concurrency (1) - Task는 Swift Concurrency system내에서 어떤 역할을 할까? 개인적으로 WWDC 2022 - Eliminate data races using Swift Concurrency 에서 기본적인 Concurrency의 개념을 학습하고 나서 이 글을 읽으니 훨씬 이해하기 편했습니다. 아직 안 보셨다면 먼저 보시는 걸 추천드립니다! https://kswift.tistory.com/25 WWDC 2022 - Eliminate data races using Swift Concurrency 이번 세션의 주제는 data race 문제를 발생시키지 않고 효율적인 동시성 프로그램을 구성하는 전체론적인 Swift Concurrency의 관점을 확인할 것이다. 시작에 앞서 진행자는 concurrency를 바다에 비유한 kswift.tistory.com 스위프트의 concurrency 시스..
WWDC 2022 - Eliminate data races using Swift Concurrency 정리하기 Concurrency - 바다 Task - 보트 보트(Task)간 통신엔 Sendable 프로토콜을 준수하는 타입만 가능하다. Sendable Sendable은 말 그대로 보낼수 있는 상태를 의미함 → data race를 발생시키지 않고 안전하게 공유할 수 있는 데이터 타입 -> Struct, Enum 과 같은 값타입들을 포함하는 것들 참조타입(Class)은 제한된 경우(final class가 immutable storage만을 가진 상황) 를 제외하곤 Sendable일 수 없다. - 이를 무시하기 위해서 @unchecked Sendable을 사용할 수 있다. 물론 문제에 대한 책임또한 생긴다. Task 클로저 내부엔 Sendable이 명시되어 있기 때문에 새로운 클로저를 생성할 때 이전 컨텍스트에서 무..
WWDC 2022 - Eliminate data races using Swift Concurrency 이번 세션의 주제는 data race 문제를 발생시키지 않고 효율적인 동시성 프로그램을 구성하는 전체론적인 Swift Concurrency의 관점을 확인할 것이다. 시작에 앞서 진행자는 concurrency를 바다에 비유한다. 바다에는 곳곳에서 여러 가지 일이 한 번에 진행되어 예측하기 어렵지만, Swift와 함께 신이 되어 바다를 탐색하면, 놀라운 일을 만들어 낼 수 있다고 한다. 그럼 신이 되어 보자. Task isolation Sequential - Concurrency 바다에서 task는 보트다. 즉 main workers이다. 그들은 해야 할 일이 있고 순차적으로 처음부터 끝까지 작업을 수행한다. Asynchronous - 작업은 비동기적으로 수행되고, 어느 순간이던지 await 키워드를 통해서..
Swift Concurrency - Perform asynchronous operation 위 글은 Swift Concurrency 공식문서를 참고했습니다. Concurrency에 대해서 알아보기에 앞서 우린 동시성을 가진 코드를 작성하고 있었다. 예를 들면 사진 이름 리스트를 다운로드하고, 첫 번째 사진을 다운로드하고 유저에게 보여주는 코드라면 listPhotos(inGallery: "Summer Vacation") { photoNames in let sortedNames = photoNames.sorted() let name = sortedNames[0] downloadPhoto(named: name) { photo in show(photo) } } completion handler를 통해서 위와 같은 코드를 작성했을 것이다. 그렇다면 새로운 방식의 Asynchronous 함수를 호출하는 ..