본문 바로가기

TIL

(41)
[TIL] Resizable Image 만드는 법 요즘 채팅 기능을 구현하던 와중 이미지 크기를 부분적으로 조절하여 말풍선을 만들 수 있다는 사실을 구글링 중 알게 되어 오늘은 이 구현 과정에 대해 포스팅해보고자 합니다. Stretchable Image애플 공식 문서에 따르면 Stretchable Image라는 개념이 나옵니다.공식 문서에 따르면 여기서 각 inset에 0이 아닌 값이 주어지면 아래 그림들과 마찬가지로 이미지를 9등분된다고 합니다. 이 9등분된 영역은 각각 다른 특색을 가지고 있는데요.예를 들어, Top/Bottom Inset 영역은 높이가 고정되고, 너비가 늘어납니다.반면에 Left/Right Inset 영역은 너비가 고정되고, 높이가 늘어납니다.그리고 나머지 코너 영역들은 너비와 높이가 고정됩니다. Stretchable Image 구..
[TIL] Pinterest UI 구현 오늘은 Pinterest라는 앱에서 유래된 Pinterest UI라는 화면 구현 과정에 대해 포스팅해볼까 합니다. Pinterest UIPinterest UI란 말 그대로 Pinterest라는 앱에서 구현된 UI에서 유래된 UI로 아래 사진처럼 이미지 고유의 비율값을 유지하면서 자유분방하게 배치된 레이아웃을 의미합니다. 아래 사진을 좀 더 자세히 살펴보면, 가로 길이는 디바이스 너비의 딱 절반을 차지하고, 세로 길이는 사진 고유의 가로/세로 비율에 따라 동적으로 배치되어 있는다는 사실을 알 수 있습니다. 이러한 사실을 기반으로 레이아웃 로직을 작성해 보겠습니다. 이미지 고유 사이즈 계산위에서 Pinterest UI 레이아웃의 핵심은 이미지의 고유 가로/세로 비율을 유지하면서 이미지를 화면에 나타낸다는 것..
[TIL] @propertyWrapper를 활용한 UserDefaults 리팩토링 문제 상황현재 진행중인 프로젝트에서 유저 정보 및 토큰 데이터를 모두 UserDefaults에서 관리해주었는데요.이런 상황이 지속하다보니 UserDefaults에 대한 코드가 반복적으로 발생하고 그에 따라 해당 코드양도 늘어나게 되었습니다.따라서 이 늘어난 코드양을 줄이고자 swift5.1부터 도입된 Property Wrapper를 활용하여 UserDefaults에 대한 코드를 리팩토링하여 줄여보고자 합니다.extension UserDefaults { enum Keys: String, CaseIterable { case userId case email // ... }}extension UserDefaults { var userId: String { ..
[TIL] Socket 통신 구현 지난번 게시글에서는 Socket에 대해 간단하게 정리해 보았습니다.이번 글에서는 Socket 통신을 직접 구현한 내용에 관해 살펴보겠습니다.구현된 화면은 아래와 같습니다.소켓 구현 설명 소켓으로 구현시 개발자의 역할은 데이터가 적절한 시점에 서버와의 연결시켜주었다가 적절한 시점에 연결을 해제하는 것이 중요합니다. 우선 가장 중요한 Socket을 구성하는 코드부터 살펴보겠습니다.(API는 업비트 API를 사용하였습니다.) WebSocket 연결아래 코드는 Socket을 연결하는 코드입니다.아래 코드를 보시면 URLSession를 default session으로 구성하였는데 그 이유는 Delegate를 통해 WebSocket에 대한 연결 상태에 대해 확인하기 위해서입니다.나머지 코드는 일반적으로 URLSes..
[TIL] Socket에 대한 간단 정리 HTTP vs SocketHTTPHTTP란 Hyper Text Transfer Protocol의 약자로 HTML 파일을 전송하는 프로토콜이라는 의미를 가집니다. 웹브라우저에서 통신이 일어나며, 초기에는 HTML 파일 정송을 목적으로 만들어졌으나 현재는 JSON, Image, 짧은 Video 등의 다양한 파일 형식을 지원합니다.HTTP 특성HTTP 특성에는 가장 크게 비연결성과 무상태성이라는 두가지 특성을 지닙니다.각각에 대해 간략히 나열해 보겠습니다.비연결성(Connectionless)비연결성이란 클라이언트와 서버가 한 번 연결을 맺은 후, 클라이언트 요청에 대해 서버가 응답을 마치면 맺었던 연결을 끊어 버리는 성질을 말합니다.비연결성의 장점HTTP 프로토콜이 이러한 특성을 지니게 된 이유는 HTTP는..
[TIL] MapKit 사용해서 위치 자동완성 검색 기능 구현 오늘은 프로젝트 진행 중 Mapkit을 사용해서 위치 자동완성 검색 기능을 구현해본 과정에 대해 포스팅해볼까 합니다.Mapkit우선 Mapkit에 대해 간단히 설명하자면 애플의 기본 지도 앱을 기반으로 지도에 관한 모든 작업을 처리할 수 있게 도와주는 지도 프레임워크입니다. 그리고 이 Mapkit 프레임워크에 오늘 구현할 기능의 핵심적인 역할을 해주는 객체가 바로 MKLocalSearchCompleter입니다. MKLocalSearchCompleter공식 문서에 따르면 이 객체를 통해 쿼리(query)를 보내는 위치 자동완성 검색 기능을 구현할 수 있습니다. 구현자 이제 실제로 구현해보록 하겠습니다.기본적인 UI 구조는 UISearchBar에 검색어가 입력되면 그 결과가 UITableView에서 표시되도..
[TIL] Alamofire 로깅(Logging) 요즘 진행하고 있는 프로젝트에서 Alamofire로 네트워크 디버깅 중인데요. 디버깅을 단순히 print() 구문으로만 진행하다 보니 디버깅 시간이 너무 오래 걸린다는 단점있었습니다. 이러한 단점을 극복하고자 로깅(Logging) 도입하였는데요. 오늘은 이 도입 과정에 대해 작성해보고자 합니다. EventMonitorAlamofire 공식 문서에 따르면 Alamofire 이벤트들에 대한 로깅 기능을 구현하려면 EventMonitor란 프로토콜을 준수해야한다고 합니다. 그렇다면 이 EventMonitor가 무엇이냐? 또, 공시 문서를 살펴보면 아래와 같이 정의되어 있습니다.The EventMonitor protocol allows the observation and inspection of a large ..
[TIL] Combine VS RxSwift 기본 차이Combine과 RxSwift에서 사용되는 개념들을 각각 대응시켜 보겠습니다.우선 RxSwift에서는 Observable - Observer - Operator 가 주요 구성 요소들인 반면Combine에서는 Publisher - Subscriber - Operator 가 주요 구성 요소들입니다. 그리고 RxSwift에서 구독하기 위해 사용되는 subscribe는 Combine에서 sink에 해당합니다.더욱이 RxSwift에서 메모리를 해제하기 위해 사용하는 dispose는 Combine에서 store에 해당합니다. 이제 Subject로 넘어가보겠습니다.RxSwift에서 주로 사용하는 Subject에는 PublishSubject와 BehaviorSubject가 있는데요.이 두 Subject는 Co..