본문 바로가기

iOS&Swift

(24)
[Swift] @Environment에 대해 알아보기(Property Wrapper 3편) 안녕하세요. 이전 글에서 @ObservedObject, @StateObject에 대해 알아봤고, 오늘은 마지막 @Environment에 대해 알아보겠습니다. @Environment A property wrapper that reads a value from a view’s environment. 출처: 공식문서 공식 문서에는. @Environment Property Wrapper는 View 환경에 저장된 EnvironmentValues 을 읽어오기 위한 Property Wrapper이고, key path를 통해 EnvironmentValues을 지정하고, 읽어올 수 있다고, 나와있습니다. 위 같은 글을 읽었을 땐 바로 이해가 되질 못했습니다. 때문에 직접 사용해 보면서 정리해 보겠습니다. 예제를 통해 사..
[Swift] @ObservedObject와 @StateObject의 차이에 대해 알아보기(Property Wrapper 2편) 안녕하세요. 이전 글에선 @State, @Binding, @Published 3가지 Property Wrapper에 대해 알아보았고, 이번엔 @ObservedObject, @StateObject에 대해 알아보겠습니다. @ObservedObject와 @StateObject A property wrapper type that subscribes to an observable object and invalidates a view whenever the observable object changes. 출처: 공식문서 둘은 비슷한 상황에 사용되고, 공통점이 많기 때문에 같이 정리해 보겠습니다. @ObservedObject와 @StateObject는 ViewModel 객체와 같은 반응형 객체를 만들 때 사용되는 P..
[Swift] @State, @Binding, @Published 대해 알아보기(Property Wrapper 1편) 안녕하세요. 오늘은 SwiftUI를 접하면서 동시에 Property Wrapper 또한 접하게 되면서 주로 사용하는 것들에 대해서 정리할 필요성을 느껴 Property Wrapper에 대해 작성해 보려 합니다. 때문에 이번에 알아볼 Property Wrapper를 소개하면, @State @Binding @Published @ObservedObject @StateObject @Environment 위 6가지에 대해 알아볼까 합니다. 6가지 외에도 더 많기도 하고, 직접 커스텀 해서 만들 수도 있지만, 프로젝트하면서 가장 많이 사용했던 것들만 뽑아봤습니다. 사실 6개도 많아서 2편으로 나눠 작성해보려 합니다. 먼저, 프로젝트 하면서 가장 많이 사용되었던 State 부터 알아보겠습니다. @State A pro..
[Swift] Alamofire의 RequestInterceptor을 사용해 토큰 갱신하기 안녕하세요. 이번에 프로젝트를 진행하면서 JWT를 통한 인증 방식을 사용했는데 앱 같은 경우 accessToken의 유효기간이 있어 refreshToken을 사용해 토큰을 갱신 받아야 합니다. 때문에 오늘 알아볼 것은 좀 더 간편하게 accessToken을 갱신 받을 수 있는 방법에 대해 알아보겠습니다. RequestInterceptor Type that provides both `RequestAdapter` and `RequestRetrier` functionality. `RequestAdapter` 및 `RequestRetrier` 기능을 모두 제공하는 유형입니다. RequestInterceptor는 Alamofire 라이브러리에서 제공하는 프로토콜 입니다. 프로토콜을 보면, adapt와, retry..
Combine 뽀개기 4장: Scheduler Scheduler A protocol that defines when and how to execute a closure. 클로저를 실행하는 시기와 방법을 정의하는 프로토콜입니다. Scheduler를 사용하는 이유는 우리가 구현한 클로저가 언제 실행될지, 무슨 쓰레드에서 실행될지 제어하기 위해서이다. 때문에 Combine에선 DispatchQueue OperationQueue RunLoop ImmediateScheduler 위와 같은 Scheduler를 제공한다. 위 DispatchQueue, OperationQueue를 이용하여 우린 클로저가 무슨 쓰레드에서 실행될지 제어해줄 수 있고, RunLoop 통해 어떠한 RunLoop에서 실행될 지 결정해 줄 수 있다. ImmediateScheduler는 생소..
Combine 뽀개기 3장: Subject Subject A publisher that exposes a method for outside callers to publish elements. 외부 호출자가 요소를 게시할 수 있도록 메서드를 노출하는 게시자입니다. Subject또한 프로토콜이다. Subject도 쉽게 생각하면, publisher의 한 종류이다. protocol Subject : AnyObject, Publisher 왜냐하면, Subject 또한 publisher를 채택받고 있기 때문이다. 자그럼 둘은 무슨 차이냐! 일반 publisher 같은 경우 선언과 동시에 방출될 값이 정해진다. 예를 들어, Just 같은 경우에도 let justPublisher = Just("Combine 첫 교시") 정해진 "Combine 첫 교시"라는 값..
Combine 뽀개기 2장: Subscriber Subscriber A protocol that declares a type that can receive input from a publisher. 게시자로부터 입력을 받을 수 있는 형식을 선언하는 프로토콜입니다. Subscriber는 공식문서에도 쓰여있듯 프로토콜 Subscriber를 채택받은 타입은 Publisher로 부터 방출된 값을 받을 수 있는 녀셕이 된다. 코드로 보면, class CustemSubscriber: Subscriber { typealias Input = String typealias Failure = Never func receive(subscription: Subscription) { print("구독 시작") subscription.request(.max(1)) } func..
Combine 뽀개기 1장: Publisher Publisher Declares that a type can transmit a sequence of values over time. 형식이 시간이 지남에 따라 값 시퀀스를 전송할 수 있음을 선언합니다. Publisher는 하나 이상의 Subscriber 인스턴스에게 Element를 전달한다. 쉬운 말로 값을 방출하는 녀셕!!! 또한 Publisher는 프로토콜이다. 내부엔 Output, Failure, receive(subscriber:)를 필수로 구현해야 한다. 하나씩 보면, Output: Publisher 객체가 내보낼 값의 타입 Failure: Error가 발생했을 때 Error 타입(Error를 방출하고 싶지 않으면, Never로 설정) receive(subscriber:): Publisher..