XELP
xelp

전체 글

iOS, Android Developer
Developer/iOS

ReactorKit 샘플코드

기본적으로 나는 MVVM 구조를 활용하여 앱의 베이스를 구성하고 앱을 짜지만, 예전부터 input-output 구조를 활용해왔다. 그렇다면, 요즘 대세라는 ReactorKit의 활용해본다. ReactorKit이란 근래의 iOS를 위시한 많은 개발 트렌드는 ReactiveX를 기반으로 한다. ReactorKit은 RxSwift를 기반으로 하며, 그렇기에 ReactorKit 자체가 RxSwift를 포함하고 있기도 하다. 따라서 기본적으로 Swift, RxSwift를 이해하고 있어야 하며, 필자의 의견으로는 input-output 패턴을 정형화하기에 좋은 라이브러리라고 생각한다. 구조 ReactorKit의 핵심은 방향이 단방향이라는 것이다. 사용자의 Action은 Reactor로 전달되며, 내부에서 Obser..

Developer/iOS

iOS FCM 적용 샘플코드

FCM 샘플코드들을 간략히 적어본다. 실제로는 APNS 샘플코드가 될 것이기도 할 것이다. FCM 수신부 FCM 토큰을 생성하는 것과 수신하는 부분이다. FCM과 APNS의 delegate를 각각 자신으로 설정한 후, FCM 요청부 UNUserNotificationCenter.requestAuthorization를 통해 알림을 요청한다. 클로저를 통해 사용자의 승인 여부가 내려온다. 이후 이 값을 통해 분기처리가 가능하다. 이후 registerForRemoteNotifications() 를 통해 등록한다. 이후 FCM 수신부에서 didRegisterForRemoteNotificationsWithDeviceToken을 통해 APNS의 토큰이 전달되며, 이를 FirebaseMessaging의 apnsToke..

Developer/iOS

CustomView With IBDesignable

서론 커스텀뷰를 만드는 여러 방법이 존재하지만, 아직까지 Xib를 통한 뷰를 나는 선호한다. 이 포스팅에 내가 주로 쓰는 형태의 커스텀뷰를 미리 게시해둔다. Swift UIView를 상속받은 뷰이다. xib를 사용하는 형태라면 awfkeFromNib()가 불리며, frame을 정하면서 초기화되는 형태라면 required init?(coder:)를 만들어둬야 한다. Interface Builder File's Owner 에 해당 class 명을 등록해둔다. IBDesignable, IBInspectable 설정에 따라 간결하게 레이아웃을 구성할 수 있다.

일상생활

은퇴하신 어머니께 드리는 선물

어머니께서 올해 은퇴하셨다. 공무원이신 어머니께서 이 못난 아들을 잘 키워주셨다. 살아오면서 여러가지 아픔이 있었고 또 기쁨도 있었지만, 뒤돌아보면 주위에 비해 잘 살아왔다는 생각이 드는 것은 부모님의 덕이 클 것이다. 어머니의 은퇴일에는 금을 해드렸지만, 낡아가는 핸드폰도 바꿔드리고 싶었다. 어머니는 아이폰을 더 선호하신다. 아들의 밥벌이 중 하나가 iOS개발인 영향일 수도 있다. 은퇴하신 후 운동도 다니시고 여행도 자주 다니신다. 새로운 추억을 남기실 때 더 좋고 선명한 기억으로 남길 수 있는 선물이 되길 바래본다.

Developer/iOS

[Combine] 3. RxSwift / Combine 호환 샘플 코드

기존 네트워크 모듈이 RxSwift로 조합되어 있었던 부분을, Combine으로 전환시켜보았다. 요청 시 cancel이 가능하도록 만들었고, 요청 전에 데이터 존재여부에 따라 리포지토리 패턴이 가능하도록 확장할 수 있게 만들었다. 기존 RxSwift와 연동되던 코드와의 비교. 완전히 구조가 같도록 업데이트한 건 아니지만 둘다 잘 활용해볼 수 있을 것 같다.

Developer/iOS

[Combine] 2. Subject

들어가기 1편에서 기초적인 부분을 알아보았다면, 2편부터는 좀 더 간편하게 만든 컴포넌트들을 알아보고자 한다. Subject Rx에서 보았던 그 Subject와 거의 같다고 볼 수 있다. 자기 자신이 데이터를 가지고 있을 수 있으면서도, 동시에 데이터를 방출하는, 즉 Publisher와 Subscriber가 동시에 될 수 있다. Rx에서 PublishSubject와 BehaviorSubject가 존재했었다. Combine에서는 PassthroughSubject와 CurrentValueSubject가 이들을 대신한다. 각각 초기값이 없는 것과 있는 것 역시 Rx와 동일한 점이다. 다만, BehaviorSubject는 구독 한 시점에 초기값 또는 이후에 발행된 현재의 최신값을 전달해주는 반면, Current..

Developer/iOS

[Combine] 1. Combine의 기초

시작 몇년 전인가, 한 블로그의 한 문구가 눈에 들어온 적이 있었다. "이제는 숨쉬듯이 쓰는 ReactiveX" 그 때의 게으른 나는, Rx의 존재를 알고 있었지만 회사 일이 바쁘다는 핑계로 더 공부를 하지 않았었고, 훗날 후회를 하고서야 공부하며 익히곤 했다. 이제 다시 iOS를 메인으로 삼고자 공부하는 중에, SwiftUI보다 먼저 Combine에 익숙해지기로 했다. RxSwift와 닮은 점이 많고, 더 활용하기도 쉬울 것이란 생각이 들었기 때문이다. Combine 이란 ReactiveX처럼, Combine 역시 Reactive 프로그래밍을 위한 녀석이다. 다만 Rx와 다르게 iOS 13때 처음 등장했으며, 애플이 만들었기에 퍼스트파티 프레임워크다. 나는 안드로이드 개발과 병행해왔기에 Reactive..

Developer/iOS

XCode 14.3 업데이트 이후 Archive 불가능한 현상 수정하기

문제점 오늘 XCode가 정식으로 14.3으로 업데이트 되었다. 여러 업데이트 내용이 있지만, 업데이트 이후 현재 관련 개발자들이 Archive함에 있어 Command PhaseScriptExecution 에러가 나타나고 있다. 해당 에러를 잘 살펴보면, Pods로 구성된 프레임워크의 위치를 찾지 못해 No such file or directory 에러가 발생하고 있다. 이유 현재까지 알려진 내용으로는 XCode 14.3부터 심볼릭 링크 관련한 업데이트가 있는 것으로 보이며, Cocoapods에서 해당 내용에 대한 업데이트가 이루어지지 않아 미리 생성된 쉘스크립트에서 파일을 찾지 못하는 것으로 보인다. 즉, 쉘스크립트 파일을 임시적으로 고치면 해결할 수 있다. 해결책 자신의 워크스페이스에서 Pods/Ta..

Developer/iOS

Generic, 그리고 Some (2/2)

이전 글에 이어, 시간이 날 때 Some을 조금 더 자세히 알아봤다. 오랫동안 코드를 들여다보며 조금 더 이해할 수 있게 되었다. 샘플코드 샘플코드는 기존과 거의 같지만, 간단히 설명해보면 Vehicle 프로토콜이 존재하며, 이를 만족하는 클래스 Car, Bus가 존재한다. TTT라는 구조체에서 some이라는 키워드를 통해 내부소스에 의해 Car(), Bus()로 형태가 정해졌으나 some Vehicle이 출력이기에 "Vehicle이라는 프로토콜을 준수하는 무언가" 라는 형태로 리턴이 되게 된다. 즉, 그렇기에 소스 내부에서 타입이 결정되는 구조이기에 Generic의 역구조라는 말이 나오는 것으로 이해된다. 실제사용 및 정리 실제 사용하는 부분이다. vehList는 어떻게 생겼든지 간에 Vehicle 프..

Developer/iOS

Generic, 그리고 Some (1/2)

Generic? Some? 보통 제네릭은 다른 언어를 쓰면서도 다룰 경우가 많이 있어 어느정도 알고 있지만, some 의 경우 SwiftUI를 공부하며 간간히 본 정도였다. 아직 완벽하게 이해를 한 건 아니지만, 이해가 된 만큼 내용을 이 포스팅에 적어본다. 샘플코드 위와 같은 struct가 존재한다고 하자. Car와 Bus는 Vehicle 프로토콜을 준수하도록 만들어져 있다. 각기 차종에 따라 가스를 충전하는 방식을 나눠놓았다. 만약 이를 다른 클래스에서 세차를 한다고 가정하자. 위 코드처럼 wash(vehicle:)을 생성했다. 제네릭에 따라 파라미터로 Vehicle 프로토콜을 준수하는 것만 들어올 수 있다. wash(vehicle: Car()) 식으로 실행할 수 있다. 이를 some으로 불투명한 타..