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..
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..

1. 옵셔널 바인딩 guard라 하면 어떤 것이 가장 먼저 떠오르시나요? 저는 옵셔널 바인딩에서의 guard let 구문이 가장 먼저 떠오르는데요 ! ! ! 먼저 옵셔널 바인딩에서의 guard에 대해 간단하게 살펴볼게요! Optional String의 파라미터를 가지는 함수를 하나 만들었습니다. 첫 번째 이미지에서 함수를 호출하니 입력한 email을 Optional 상태로 받았습니다. 두번째 이미지에서는 guard let 구문을 통해 옵셔널 바인딩을 하여 안전하게 email을 받을 수 있었습니다. guard let 옵셔널을 벗겼을 때 nil이면 더 이상 코드를 실행시키지 않겠다는 의미가 강함 -> nil이 아닐 때만 관심을 갖겠다. 선언된 변수를 아래문장에서 사용 가능 (동일한 스코프로 취급) 이러한 특..
요즘 들어 제가 사용하는 코드들에 대한 의미를 알고 쓰는 것이 맞는지, 왜 쓰는 것인지 에 대한 의문이 듭니다.. 그 중 하나가 private 키워드인데요. 프로젝트를 진행하면서 private 키워드를 붙여서 파일 내 변수나 함수를 만들었습니다. 코드리뷰 단계에서 특히 이 부분을 유심하게 체크하기도 하고 새삼 중요하다고 생각을 했었습니다. 그러던 중 왜 써야하나? 라는 의문이 들었고 아 부분에 대해 정리를 해보려고 합니다. (private를 포함해서 접근제어자는 다양한 키워드가 있지만 포괄해서 정리를 하겠습니다.) private 비공개 접근수준은 가장 한정적인 범위이다. 비공개 접근수준으로 지정된 요소는 그 기능을 정의하고 구현한 범위 내에서만 사용할 수 있다. 비공개 접근수준으로 지정한 기능은 같은 소..
lazy 키워드를 정리하게 된 이유는 코드로 UI를 작성하면서 궁금증이 생겨서입니다. 친구와 let과 private lazy var 둘의 차이점이 무엇일까에 대해 얘기를 나눴었는데 정리하면 좋을 것 같아서 정리를 해봅니다! 우선 간단하게 터치를 할 수 있는 버튼을 만들어보겠습니당 let letButton = UIButton().then { $0.addTarget(self, action: #selector(letButton), for: .touchUpInside) } private lazy var lazyButton = UIButton().then { $0.addTarget(self, action: #selector(lazuyButton), for: .touchUpInside) } 요 둘의 차이가 가장 큰..

@main에 대해 작성하게 된 이유는 AppDelegate와 SceneDelegate의 역할과 기능을 공부하면서 궁금한 것들이 많이 생겨서 입니당 2021.09.29 - [SSAC - iOS] - [SSAC - iOS] 09월 28일 TIL [SSAC - iOS] 09월 28일 TIL 1. 앱의 구조와 동작 원리 화면 기능 데이터 데이터가 앱 내부에 저장이 되어 있을 경우 : 백업/복구 필수 (ex. 혼자 사용하는 투두, 일기, 영화 관리 앱 등) 데이터가 서버에 저장이 되어 있을 경우 seungchan.tistory.com 기존에 간단하게 포스트했었는데 다시 한 번 정리해보겠습니다. (다음 글에서는 AppDelegate와 SceneDelegate에 대해 작성해보겠습니다.) 프로젝트를 생성하면 기본적으로..

SeSAC 과제를 하다가 특정 뷰컨트롤러로 넘어갈 때 Navigation Bar가 보이지 않게끔 설정해야 할 때가 있었습니다. 들어가기에 앞서 ViewController의 생명주기에 대해 살펴 보고 넘어가겠습니다! viewDidLoad()와 viewWillAppear()를 살펴보면 viewDidLoad() 뷰계층이 최초 메모리에 로드 된 후 호출되는 메서드 메모리에 처음 로딩 될 때 1회만 호출된다. viewWillAppear() 다른 뷰에 갔다가 다시 돌아오는 상황에 해주고 싶은 처리에서 사용한다. viewDidLoad()와 구분할 것 이렇게 설명을 할 수 있습니다. 네비게이션바를 특정 뷰컨에서 없애는 것과 이게 무슨 관련이 있는데? 라고 의문이 드실텐데요. 위의 사진에서 보듯이 viewDidLoad(..