TCA 내부 코드를 살펴보면 기본적으로 struct로 구현되어 있는 것을 볼 수 있다.struct로 구현함으로써 아래와 같은 장점을 가질 수 있다.Struct 사용의 장점불변성이 보장된다.복사로 인한 상태 변화 추적이 용이하다.스레드 간 공유 시 자동으로 복사되어 안전하다.참조가 아닌 값으로 동작하므로 사이드 이펙트가 감소한다.하지만 struct를 사용함으로써 스택 오버플로우와 같은 중요한 단점도 발생할 수 있다. https://github.com/pointfreeco/swift-composable-architecture/discussions/3147https://medium.com/@lot32nao/stack-overflow-due-to-memory-exhaustion-from-recursive-nav..

@Model 살펴보기1. BackingData@Transientprivate var _$backingData: any SwiftData.BackingDatapublic var persistentBackingData: any SwiftData.BackingDataSwiftData가 실제 데이터를 저장하고 관리하는 방식이다.@Transient는 이 프로퍼티가 영구 저장소에 저장되지 않음을 나타낸다.BackingData는 실제 데이터 저장소와의 연결을 관리한다.class BackingData { // 실제 데이터를 저장하는 딕셔너리 var data: [PartialKeyPath: Any] = [:] // 데이터 읽기 func get(_ key: KeyPath) -> V { ..
TMDB API를 사용한 Task, TaskGroup, Async-let 성능 비교들어가며TMDB API를 사용하여 영화 정보를 가져와 화면에 보여준다.Task TaskGroup Async-let 세 가지 방법을 Instruments 통해 비교해보려고 한다.다만 Async-let은 병렬로 동작하지 않는데 그 이유는 밑에서 설명하겠다.1. Task/// MovieViewModel 내 fetchMoviesWithTask()@MainActor func fetchMoviesWithTask() { Task { state = .loading do { let response: MovieResponse = try await networ..
Swift는 구조화된 방식으로 비동기와 병렬 코드 작성을 지원한다.구조화된 동시성 (structured concurrency Vs unstructured concurrency)비동기 코드일시적으로 중단되었다가 다시 실행할 수 있지만 한번에 프로그램의 한 부분만 실행된다.프로그램에서 코드를 일시 중단하고 다시 실행하면 UI 업데이트와 같은 짧은 작업을 계속 진행하면서 네트워크를 통해 데이터를 가져오거나 파일을 분석하는 것과 같은 긴 실행 작업을 계속할 수 있다.병렬 코드동시에 코드의 여러부분이 실행됨을 의미한다.예를 들어 4코어 프로세서의 컴퓨터는 각 코어가 하나의 작업을 수행하므로 코드의 4부분을 동시에 실행할 수 있다.Swift 에서 동시성 모델은 쓰레드의 최상단에 구축되지만 직접적으로 상호작용하지 않..
Swift Concurrency를 사용한 Task 및 Continuation 동작 원리 분석공통 코드는 버튼을 클릭했을 때, 0~100,000까지 계산해서 UILabel에 업데이트한다.Continuation의 생성과 어떤 코드에서 어떤 동작을 할 지, 예측 및 분석한다.Concurrency 동작에 따라 Context Switching 비용 분석과 어느 Thread에서 동작하는지 살펴본다.1. Continuation 코드@objc private func task1ButtonTapped() { // 1. Creating -> Running Task { // 2. Running -> Suspended (await로 인해) let result = await basicAsync..
GCD -> Continuation, async await에서 차이점이 뭘까? - GCD는 작업을 큐에 넣고 나면 자동으로 스케줄링하여 처리하고, 실행 중인 특정 작업을 일시 중지하거나 다시 이어서 실행하는 기능은 없다. - DispatchQueue.async는 태스크 실행을 위해 큐에 맡기지만, 작업이 실행되는 도중 중지되었다가 다시 이어지도록 상태를 저장하지 않는다. - Continuation이 작업의 상태를 유지하고, 조건이 충족되면 다시 이어질 수 있다. - 즉, Continuation은 비동기 함수의 실행을 일시 중지하고, 특정 조건이 충족되면 다시 실행을 이어갈 수 있는 기능이다. - Concurrency에서는 async로 메서드를 호출하면 thread의 제어권을 포기하는 suspende..

let taskA = Task { print("Task A 시작") try await Task.sleep(nanoseconds: 1_000_000_000) print("Task A 완료") return "결과 값" } let taskB = taskA print("taskA 상태: \(taskA.isCancelled ? "취소됨" : "실행 중")") taskA.cancel() print("taskB 상태: \(taskB.isCancelled ? "취소됨" : "실행 중")") Task { do { let result = try await taskB.val..
TripStyle에서는 TabBarController에서 3개의 탭을 관리하고 있고, 로그인 플로우까지 총 4개의 화면들이 이어진다. 탭바 아이템을 클릭했을 때 각각의 모듈의 시작점이 호출되는데, Coordinator 패턴을 통해서 이를 관리하는게 좋을 것 같다고 생각했다. 모듈간 의존성을 살펴보면 App (SceneDelegate, AppDelegate) -> Feature (ViewController, ViewModel을 가지고 있는 모듈) 이런 방향으로 되어 있는데, 고민해야 할 부분이 각 화면들의 Coordinator의 적합한 위치와 TabBarCoordinator, AppCoordinator, Coordinator Protocol 들에 대한 위치이다. TabBarCoordinator, AppCo..

01. RxSwift + MVVM-C로 되어있는 프로젝트를 Combine, Clean Architecture, Tuist로 마이그레이션 계획을 세웠다. RxSwift를 걷어내고 싶은 이유는 다음과 같다.. 1. ThirdParty이기 때문에 애플에서 권장하는 FirstParty인 Combine 프레임워크를 사용해보고 싶었다. 2. 이미 다른 프로젝트들에서 RxSwift(잘 사용하지는 않지만,,)를 사용해본 경험이 있어 Combine을 선택한 이유도 있다..! 3. 마지막 이유는 SwiftUI와 데이터 바인딩에 유리하다는 이야기를 듣고,, (언젠간 사용할 예정) 선택하게 되었다.. 결론은 써보고 싶어서,, 이게 가장 큰 이유 ,,! 다음으로 Tuist를 적용한 이유는..! 1. .xcodeproj 파일로 ..

1. 옵셔널 바인딩 guard라 하면 어떤 것이 가장 먼저 떠오르시나요? 저는 옵셔널 바인딩에서의 guard let 구문이 가장 먼저 떠오르는데요 ! ! ! 먼저 옵셔널 바인딩에서의 guard에 대해 간단하게 살펴볼게요! Optional String의 파라미터를 가지는 함수를 하나 만들었습니다. 첫 번째 이미지에서 함수를 호출하니 입력한 email을 Optional 상태로 받았습니다. 두번째 이미지에서는 guard let 구문을 통해 옵셔널 바인딩을 하여 안전하게 email을 받을 수 있었습니다. guard let 옵셔널을 벗겼을 때 nil이면 더 이상 코드를 실행시키지 않겠다는 의미가 강함 -> nil이 아닐 때만 관심을 갖겠다. 선언된 변수를 아래문장에서 사용 가능 (동일한 스코프로 취급) 이러한 특..