[회고] 신입 iOS 개발자가 되기까지 feat. 카카오 자세히보기

🍎 Apple/Concurrency & GCD 11

[Concurrency] Task Group의 동시성을 제한하는 방법

참고자료 : WWDC23 Beyond the basics of structured concurrency Task Group의 동시성을 제한하는 방법 chopIngredients는 여러 재료(ingredients)를 받아 그들을 하나씩 써는(chop) 메서드이다. 하지만 정말 하나씩 재료를 썬다면 이는 비효율적일 것이다. 동시에 처리하고 싶다. Task Group을 사용하여 Structed Concurrency를 구성하고 하위 Task를 여러개 추가해 처리한다. 그리고 하위 Task가 모두 완료되었을 때 요청한 chopIngredients Task가 종료된다. 다만 여기서 주의할 점은 파라미터로 제공하는 재료들(ingredients)이 너무 많을 경우 각각에 대해 실행 Context를 생성하고 우리는 모든..

[Concurrency] Explore structured concurrency in Swift

본 게시글은 WWDC21의 Explore structured concurrency in Swift 세션의 내용을 담고 있습니다. https://developer.apple.com/videos/play/wwdc2021/10134/ Explore structured concurrency in Swift - WWDC21 - Videos - Apple Developer When you have code that needs to run at the same time as other code, it's important to choose the right tool for the job. We'll take you... developer.apple.com Structured Programming 컴퓨팅 초기에는 제어..

[Concurrency] Actor

Task 복습 Task는 block 내부를 비동기적으로 실행해준다. print("\\(Thread.current)") Task { print("\\(Thread.current)") } print("\\(Thread.current)") // {number = 1, name = main} // {number = 6, name = (null)}// {number = 1, name = main} 그런만큼 각 Task는 독립적인 동작을 수행한다. 만약 참조타입의 값을 공유할 경우, 데이터에 동시적으로 접근하는 Data Race가 발생할 수 있다. 다만 무조건으로 동시성을 보장하는 것은 아닌데, 부모의 Context를 물려받는 경우 Task를 열어 비동기 컨텍스트를 만들어도 같은 스레드에서 실행될 수 있기 때문이다..

[Concurrency] Continuation

Continuation Continuation Continuation는 동기식 코드와 비동기식 코드 간의 인터페이스를 위한 메커니즘이다. 즉, 동기식 코드를 비동기식 코드에 이식할 때 간단하게 인터페이스를 제공해줄 수 있는 것이다. 그 종류에는 정확성 체크를 진행하는 CheckedContinuation와 체크하지 않는 UnsafeContinuation가 있다. 정확성 체크란 누락되거나 여러 번 재개된 작업이 있는지 런타임 검사를 수행하는 것을 의미한다. UnsafeContinuation는 오버헤드가 적은 것을 목표로 하기 때문에 불변성을 체크하지 않는다. 대표적으로 사용하는 함수는 withCheckedThrowingContinuation(withCheckedContinuation)이다. func getD..

[Concurrency] Task

Task Task : 격리되어 있고 독립적인 비동기 작업 단위로, 코드 내에서 이를 활용하면 내부 코드는 비동기적으로 동작한다. async 함수를 사용하기 위해서는 그 함수를 호출하는 컨텍스트 또한 동시성을 띄고 있어야 한다. (스레드가 제한된 상황에서는 처리 불가능) 그러면 async를 호출하는 곳을 async로 만들고 이를 반복하다보면 결국엔 일반 메서드까지 도달할텐데 어떻게 처리해야 할까? 이럴 때 사용하는 것이 Task이다. Task를 사용하면 명시적으로 동시성 컨텍스트를 생성할 수 있게 된다. 함수를 async로 표시하면 기본적으로 Task를 기반으로 한 동시성 컨텍스트를 사용하지만, 한 비동기 함수에서 다른 비동기 함수를 호출할 때는 여전히 동일한 Task(실행 컨텍스트)가 실행에 사용된다. ..

[Concurrency] async / await

기초 개념 스레드와 실행컨텍스트 스레드 : 운영체제 관리하는 실행단위로, 하나의 프로세스 내에서 여러개의 스레드가 동시에 실행될 수 있다. 스레드는 독립적인 스택 및 레지스터를 가지고 있으며 CPU가 실행할 수 있는 최소 단위이다. 스레드는 병렬성을 구현하는데 사용된다. 실행 컨텍스트 : 실행중인 코드의 실행상태를 추상화하는 개념으로, 실행 컨텍스트는 해당 코드의 실행위치, 변수값, 호출스택 등을 저장한다. 비동기적 실행을 구현하는데 사용된다. 각 실행 컨텍스트가 해당 코드의 실행 상태를 저장하고 있어 해당 코드가 중단되고 다시 실행될 수 있다. 예를 들어 함수를 호출하면 해당 함수는 독립적인 실행 컨텍스트를 가진다. Swift에서는 Task로 실행 컨텍스트의 개념을 대체한다. 하나의 스레드는 여러개의 ..

[Swift] GCD 정리하기

GCD GCD는 Grand Central Dispatch의 줄임말로, 멀티 코어 프로세스 시스템의 스레드 관리에 대한 책임을 운영체제 레벨에게 넘겨주는 기술입니다. GCD 내부에는 DispatchQueue를 읽는 멀티코어 실행엔진을 가지고 있어 이것이 등록된 작업을 읽어 스레드에 할당합니다. 개발자는 내부 동작에 대해 이해할 필요없이 Queue에 작업을 할당하기만 하면 되기 때문에 스레드관리가 훨씬 쉬워집니다. OperationQueue 역시 내부적으로는 GCD를 활용하고 있습니다. Dispatch Queue Dispatch Queue는 FIFO Queue의 형태로 작업을 순서대로 전달받습니다. 작업은 Block( { } ) 혹은 Dispatch Work Item 인스턴스로 캡슐화하여 전달합니다. ser..

[Swift] Operation Queue

Operation Queue Swift에서 Concurrency Programming을 구현할 때 사용하는 API 중 하나로, 주로 작업 사이에 의존성을 부여하거나 취소 기능을 구현할 때 사용합니다. Operation 하나의 작업을 나타내는 객체로, 보통 Operation class를 상속한 BlockOperation class를 사용하거나 직접 Operation class를 상속받고 Custom Operation을 구현하여 사용합니다. Operation은 서로에게 의존성을 부여할 수 있습니다. 또한 취소가 가능합니다. Completion Handler를 적용할 수 있습니다. Single-shot Object (실행이 완료된 인스턴스는 재실행이 불가능) Ready - Executing - Finished..

[Swift] Actor

참고 및 출처 https://docs.swift.org/swift-book/LanguageGuide/Concurrency.html https://medium.com/hcleedev/swift-actor%EB%9E%80-f8f58c68dab9 https://zeddios.tistory.com/1290 Actor class Counter { var count: Int = 0 func increment() { self.count += 1 } } 이런 경우에 let counter = Counter() DispatchQueue.global().async { counter.increment() } // global counter.increment() // main 이런식으로 2개의 스레드에서 동시 접근을 하면 Xc..

[Swift][문서의역] Task

참고 및 출처 https://developer.apple.com/documentation/swift/task/ https://www.avanderlee.com/concurrency/tasks/ Task & TaskGroup Task 인스턴스를 생성할 때 해당 Task가 수행할 작업을 포함하는 클로저를 함께 제공하게 됩니다. Task는 생성 직후 실행을 시작할 수 있습니다. 명시적으로 시작하거나 예약하지 않아도 됩니다. Task를 만들면 해당 인스턴스를 사용하여 작업과 상호작용합니다. 예를 들어 Task의 작업이 완료될 때까지 기다리거나 취소할 수 있습니다. Task의 작업이 완료될 때까지 기다리거나 취소할 때까지 기다리지 않고 Task에 대한 참조를 버리는 것은 프로그래밍적 에러가 아닙니다. Task는..