전체 글

전체 글

    [SwiftUI] SwiftUI는 뷰를 어떻게 구분하고 업데이트 하는가.(Identity, Lifetime)

    SwiftUI는 뷰를 어떻게 구분하고 업데이트할까요? 또 Identity, Lifetime등 용어는 무엇일까요? 오늘은 이를 정리해보겠습니다. 우선 이를 알기위해 알아야 할 사전 지식이 있습니다. 동등성(equality)와 동일성(Identity)입니다. 동등성(Equality) 이 둘은 같을까요? Equatable로 비교하면 이 둘은 같습니다. 이렇게 상태만을 비교하면 이 둘은 같다고 할 수 있습니다. 동일성 한 clamp가 있다고 가정해봅시다. 우리는 이름도 같고, 나이도 같기 때문에 같은 clamp라고 생각 할 수 있습니다. 하지만 Equatable로 비교하면 다르다고 나옵니다. 상태가 다르니까요 만약 우리가 저 둘을 동일한 clamp라고 생각하려면, 즉 같은 clamp로 "식별"하려면 무언가가 필..

    [iOS] Alamofire 네트워크 레이어 설계2. 토큰관리(Interceptor)

    Alamofire에서 토큰 갱신, 에러 처리등을 효율적으로 하기위해 제공해주는 Interceptor라는 프로토콜이 존재합니다. Interceptor는 서버에 요청을 보내기 전에, 중간에 가로채서 어떠한 작업을 수행할 수 있게 해주고 요청의 결과로 Error가 발생한 경우 요청을 다시 할 것인지를 처리할 수 있게 해줍니다. - adapt(): API호출 전에 URLRequest를 가로채서 어떤 작업을 할 수 있도록 해주는 메서드 - retry(): API호출의 결과로 Error가 발생한 경우 요청을 다시 할 것인지 처리하도록 해주는 메서드 Alamofire가 제공하는 RequestIntereptor의 본문은 다음과 같습니다. 이를 그림으로 구조를 그려보면 아래와 같습니다. 만약 토큰을 활용해 서버와 통신하..

    [iOS] 커스텀 액티비티 인디케이터 제작 feat. RxSwift

    커스텀 액티비티 인디케이터 iOS 앱 개발에서 사용자에게 작업이 진행중임을 알리는 것은 중요합니다. 기본 제공되는 액티비티 인디케이터가 존재하지만 때론 앱의 디자인과 더 잘 어울리는 커스텀 액티비티 인디케이터를 만들어야 할 경우가 많습니다. 네트워크 통신을 진행할 때 통신중 또는 로딩중인 경우 또는 어떤 작업(오래 걸리는 작업)을 진행중일 경우 사용자에게 알려줘야합니다. 그렇지 않으면 사용자는 앱이 멈춘건지, 로딩중인건지, 기다려야하는지 판단하기 힘듭니다. 이럴 때 ActivityIndicator는 사용자에게 프로그램이 정확히 작업중이라는것을 알 수 있게 해줍니다. 이런 커스텀 액티비티 인디케이터를 어떻게 만들었고 네트워킹과 어떻게 연결하여 사용하였는지 기록해보겠습니다. 앞서 해당 프로젝트에서는 Alam..

    SwiftUI TCA - 3. State, Action, Reducer, Effect

    TCA의 구성을 하나 씩 살펴보겠습니다. 앱의 상태 "State" State는 Reducer의 현재 상태를 갖는 구조체입니다. 쉽게 비즈니스 로직을 수행하거나 UI를 그릴 때 필요한 데이터를 소지합니다. 예를 들어 카운트를 증, 감 시키는 어플리케이션을 가정합니다 그럼 카운트를 표시하기위해 State는 다음과같이 count데이터를 소지하고 있을 것 입니다. struct CounterFeature: Reducer { struct State: Equatable { var count = 0 } ... } 여기서 State는 Equatable인데요, 그 이유는 다음과 같습니다. SwiftUI는 View의 상태가 변경되었을 때 해당 view를 자동으로 업데이트 합니다. 즉 현재 상태와 이 전 상태를 비교하여 불 ..

    SwiftUI TCA - 2. 단방향 아키텍처 TCA

    TCA는 단방향 아키텍처입니다. 하지만 SwiftUI는 양방향 데이터 바인딩을 지원합니다. View가 ViewModel에서 요청을 받아와서 추가작업을 해야하는 경우가 발생합니다. 이런 상황에 팀원과의 협업중 코드 작성에 유의하지 않는다면 나중에 언제 어디서 상태가 바뀌는지 알기 파악하기 어려운 문제가 생길 수 있습니다. 이와달리 TCA의 상태 변화에 대한 일관적인 가이드라인을 컴파일 단계에서부터 강제합니다. 어떠한 개발자던 TCA를 사용한다면 Action 정의, Action에대한 View에서의 .send() 를 거쳐야합니다. 이러한 규칙을 적용할 수 있습니다. TCA의 핵심은 다음과 같습니다. 1. State management(상태 관리): 상태를 공유하는 방법. 이를 통해 특정 화면에서의 상태변화를 ..

    SwiftUI TCA - 1. TCA의 등장 배경

    애플 생태계 개발은 주로 Swift로 많이 작성됩니다. 이렇게 작성된 코드들의 관리 방법또한 중요합니다. 3일뒤, 3주뒤, 3달뒤에 코드를 돌아볼 때 어느 파일에 어느 코드가 있을지 알아야 유지보수에 용이하기 때문입니다. 코드를 정리하고 구현하는데에는 일정한 규칙이 있습니다. 정형화된 하나의 규칙을 제안하는것 = '디자인 패턴(Design Pattern)' 정리된 코드들을 더 추상화된 비즈니스적 문제 해결 관점으로 정리하는것 = '아키텍처 패턴(Architecture Pattern)' 여기선 상태관리 및 의존성 라이브러리인 The Composable Architecture를 활용한 아키텍쳐 패턴에 대해 정리합니다. 기존의 패턴 Swift, SwiftUI로 선언형 UI를 구현하는 환경에서는 MVVM패턴이 ..

    SwiftUI - @ObservableObject, @ObservedObject, @Published, ObjectWillChange

    @ObservableObject @ObservedObject는 ObservableObject 프로토콜을 준수하는 객체를 관찰하는 뷰 내에서 사용되는 프로퍼티 래퍼입니다. ObservableObject는 Class형태만 가능합니다. Struct형태는 불가능합니다. class의 @Published 인스턴스의 변화를 감지하고 해당 인스턴스가 변화할 때 마다 뷰를 업데이트합니다. ObservableObject 프로토콜을 준수하면 objectWillChange프로퍼티를 사용할 수 있습니다. * @Published 어노테이션은 값이 변동되었을때 바로 View에게 즉각적으로 알려주는 어노테이션입니다. ex) class MyViewModel: ObservableObject { @Published var score =..

    SwftUI - @State, @Binding

    @State와 @Binding은 모두 데이터의 서유와 공유 방식을 다루는 두가지 property wrapper입니다. @State 뷰 내에서 private 상태를 관리하기위한 프로퍼티 래퍼입니다. 뷰 내부 상태를 저장하기위해 사용됩니다. 해당 프로퍼티 래퍼로 생성된 변수의 상태 변경시 뷰가 자동으로 업데이트되게합니다. ValueType으로 Struct, Enum 활용이 적절합니다. @State프로퍼티 값이 변경될 때 마다 뷰를 다시 랜더링합니다. 최신 상태를 유지하도록. 여기서 $가 등장합니다. Toggle의 isOn값은 Binding 값을 받으므로 $를 붙혀 초기화합니다. isOn -> Bool값 $isOn -> Binding @Binding 부모뷰로부터 전달받은 상태 또는 다른뷰와의 상태를 공유하기위..

    PropertyWrapper의 projectedValue

    프로퍼티래퍼에대한 정보는 아래 포스팅에 정리되어있습니다. https://clamp-coding.tistory.com/396 projectedValue SwiftUI에서 @State, @Binding, @Published등의 프로퍼티 래퍼들은 각각의 *projected value(투영값)을 가집니다. 이 투영값은 프로퍼티 래퍼가 제공하는 추가 기능에 접근할 수 있도록 해주는데, 특히 바인딩이나 다른 형태의 상태관리를 위한 인터페이스 역할을 합니다. 이는 SwiftUI가 관리하는 변수의 "특별한 버전"을 의미합니다. 해당 변수를 UI컴포넌트와 연결하거나 변수의 변화를 감시하는 등의 추가적인 작업을 할 수 있게 됩니다. ProjectedValue는 해당 프로퍼티의 "추가기능"에 접근할 수 있는 방법입니다. '..

    [iOS] - UICollectionView Compositional Layout

    앱스토어 앱. CompositionalLayout을 사용하지 않는다면 테이블뷰 내부의 셀 내부의 컬렉션뷰 내부의 테이블뷰... 이런 복잡한 레이아웃을 보완하기위해 Compositional Layout의 등장. 전체 하나의 CollectionView로 섹션별 다양한 레이아웃을 적용 가능 구성 하나의 Layout 내부의 여러 Section이 포함되며 Section은 여러 Group을 포함한다. Group은 Item을 갖고있다. 이들의 크기를 지정해주면 된다. CollectionView의 item 사이즈를 정하는 방법(NSCollectionLayoutDimension) .absolute - 고정 크기 .estimated - 런타임에 크기가 정해지는경우(예상크기) .fractional - 비율(컨테이너에 대한 ..