Concurrency
-
Swift Concurrency - @MainActor 사용하기Concurrency 2023. 3. 27. 10:47
안녕하세요. 그린입니다🍏 이번 포스팅에서는 @MainActor를 사용해 메인 큐에서 UI 업데이트를 자동으로 전달하는 방법에 대해 학습해보겠습니다🙋🏻 ☝️ UI 업데이트는 꼭 메인 스레드에서 진행되어야 한다 우선 다들 알다시피 iOS에서 UI 업데이트에 관한건 모두 메인 스레드에서만 업데이트 해야한다는 점입니다. 만약 메인 스레드가 아닌 타 백그라운드 같은 스레드에서 UI 업데이트를 친다면 예기치 못한 동작이 발생할 수 있고 또한 경고를 내보내죠! 따라서 백그라운드 스레드에서 직접 혹은 간접적으로 작업을 수행할 때마다 UI 렌더링과 관련한 속성 및 메서드에 접근하기 전에 꼭 메인 스레드로 이동시켜야 합니다. 물론 당연한거 아니야? 라고 생각될 수 있습니다. 그러나 실제 작업을 하다보면 백그라운드 스레드에..
-
Swift Concurrency - ActorConcurrency 2023. 3. 20. 11:16
안녕하세요. 그린입니다🍏 이번 포스팅에서는 Actor가 무엇인지 간단히 살펴보고 Swift Concurrency에서 어떻게 활용되는지 학습해보겠습니다🙋🏻 우선 Swift에서는 다들 아시다시피 다양한 유형을 클래스, 구조체, 열거 타입등으로 정의할 수 있습니다. 거기다 Swift 5.5에서부터는 Swift Concurrency가 도입되면서 actor라는 새로운 유형이 짠하고 나타났어요⭐️ 그럼 우선 actor 탄생 전에 어떻게 기존 유형을 가지고 데이터를 처리했을까요? 데이터 경합 방지 Swift의 새로운 유형인 actor의 가장 핵심적인 장점 중 하나는 race condition, 즉 데이터 경합이라는것을 방지해줄 수 있습니다. 두 개의 개별 스레드가 동시에 동일한 데이터에 엑세스하거나 변경하려고 할 때..
-
Swift Concurrency - 이전 버전에서 비동기 시스템 API 사용하기Concurrency 2023. 3. 16. 13:54
안녕하세요. 그린입니다🍏 이번 포스팅에서는 비동기 시스템 API를 이전 버전에서 사용할 수 있도록 구현하는 학습을 해보겠습니다🙌 Swift Concurrency가 iOS 13부터 사용이 가능하게 나왔어도 계속 디벨롭을 거쳐 왔습니다. (당연하지만!?) 그렇기에 오늘 예시로 들어볼 iOS 15 이상에서 URLSession 네트워킹에서 편하게 async/await를 사용할 수 있지만 그 하위 버전인 iOS 13, 14대에서는 직접 사용하지 못하는 불편함이 있었어요😭 이전 포스팅에서도 잠깐 나왔는데 Swift 5.5 부터 비로소 기존 코드에서도 비동기 처리를 할 수 있게 변화했다고 했죠? 즉 Xcode 13.2부터 호환이 되지만 그 기준이 OS로는 iOS 15, macOS Monterey입니다. 그래서 오늘 ..
-
Swift Concurrency - Throwing & 비동기 Swift 프로퍼티Concurrency 2023. 3. 14. 08:47
안녕하세요. 그린입니다🍏 이번 포스팅에서는 프로퍼티에 대해 조금 다뤄볼 예정이에요. 정확히는 Throwing 및 비동기 속성의 프로퍼티를 학습해보겠습니다🙋🏻 Throwing 프로퍼티 예시로 너무 익숙한 아래와 같은 Result 타입을 반환하는 throws 메서드가 있다고 생각해볼께요. func handleLoginResult(_ result: Result) throws { let user = try result.get() ... } 여기서 get 메서드는 실제로 어떤 종류의 작업도 수행하지 않고 try 키워드를 사용해 Result 값을 만들 수 있기에 프로퍼티로 선언할 수 있어요. 자 그럼 아래와 같이 만들 수 있겠죠? extension Result { var value: Success { get thr..
-
Swift Concurrency - Async sequence & streamConcurrency 2023. 3. 9. 09:10
안녕하세요. 그린입니다🍏 이번 포스팅에서는 비동기 시퀀스와 스트림에 대해 알아보고 기존 컴바인 코드에 어떻게 녹여내는지 학습해보겠습니다🙋🏻 일반적으로 for문 같이 루프를 돌며 Swift 컬렉션을 반복할 때 반복할 코드에 전달될 요소를 결정하는데에는 두가지 핵심 요소가 있습니다. sequence와 iterator⭐️ 뭔가 한번씩은 다 들어봤고, 어 어디서 봤는데? 싶으실거에요! 예를들면 Swift의 array 타입은 기본적으로 sequence 프로토콜을 준수하며 iterator 타입으로 IndexingIterator를 사용합니다. 우리는 Swift 코드 작성 시 시퀀스와 직접 상호 작용하는 경우가 매우 많지만 for 루프를 사용할 때마다 Swift 언어 자체가 이러한 인스턴스를 자동으로 관리해주기 때문에..
-
Swift Concurrency - map & forEachConcurrency 2023. 3. 9. 07:51
안녕하세요. 그린입니다🍏 이번 포스팅에서는 map과 forEach에 대해 Swift Concurrency 세상으로 가져와 비동기 및 동시(병렬) 처리를 해보겠습니다🙌 우리는 많은 데이터들이 들어올때 map과 forEach로 종종 다뤄주곤 합니다. 그런데 해당 데이터들을 다뤄줄때 항상 비동기적으로 일어나지 않을뿐더라 해당 내부 작업들을 동시 처리를 하지 않습니다. 즉 한 스레드에서 돌게되고 처리할것이 많아지면 다른 작업에 병목이 생길때가 있죠. 그래서 이번 주제는 이런 데이터 변환을 수행할 때 Concurrency의 동시성 시스템을 활용해보려고 합니다! 동기 변환 우선 우리가 아주 익숙한 구조부터 볼께요. class MovieListViewController: UIViewController { privat..
-
Swift Concurrency - ParallelConcurrency 2023. 3. 6. 08:56
안녕하세요. 그린입니다🍏 이번 포스팅에서는 Swift Concurrency Task의 소개에 이어 여러 Task를 병렬로 처리하는 방법에 대해 학습해보겠습니다🙌 우리가 Swift Concurrency를 사용하는 가장 근본적인 이유는 비동기 처리를 다루는것도 있지만 이걸 다루는 이유 자체가 비동기 작업을 병렬로 대부분 수행하기에 이점을 가져가기 위함도 있을거에요! 즉, Swift에 내장된 동시성 시스템의 이점 중 하나로 비동기 작업의 병렬 처리를 꼽을 수 있습니다. 그럼 비동기 작업을 병렬로 처리하는 몇가지 방법에 대해 알아보시죠🕺🏻 비동기 작업을 동시성으로 처리하기 어떤 한 클래스에 다양한 비동기 작업을 수행하는 메서드가 있다고 생각해볼께요. class ProductLoader { ... func loa..
-
Swift Concurrency - Task (4)Concurrency 2023. 3. 2. 12:11
안녕하세요. 그린입니다🍏 이번 포스팅에서는 이제 드디어 Task 탐험의 마지막! 비동기 Swift Task에서 자동 재시도에 대해 알아보겠습니다🙌 저번 포스팅에서는 Task의 지연을 거는 방법에 대해 알아봤다면 이번 포스팅에서는 Task를 자동으로 재시도하는 방법을 보시죠! Task 자동 재시도 우리는 네트워크 통신을 할때 한번에 응답되지 않는 상황들도 있습니다. 클라의 잘못된 요청이 아닌 서버에서 내부적인 아주 잠깐의 이슈라던지 하는 문제가 발생할 수 있죠. 즉 이런 경우 동일하게 실패한 비동기 Task 요청을 자동으로 재시도 해야합니다. 만약 Swift Concurrency를 사용하지 않고 우리가 그전에 익숙한 Combine을 사용한다면 아래와 같이 retry로 에러 처리 전 최대 3번의 재시도를 거..