본문 바로가기

전체 글

(38)
[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..
[TIL] Swift Concurrency 등장 배경 GCD vs Swift ConcurrencyGCD현재 Swift에서 동시성 프로그래밍에 가장 많이 사용되고 있는 API입니다. 이 GCD에는 크게 한 번에 하나의 테스크를 순차실행하는 Serial DispatchQueue와 많은 작업을 동시에(concurrent) 실행하게 해주는 Concurrent DispatchQueue라는 두 가지가 존재합니다. Queue라는 이름에서 유추할 수 있듯이 실행되는 순서는 선입선출(First-In First-Out)입니다.Swift ConcurrencyAsync/Await를 필두로 주로 클로저로 이루어저 있는 GCD의 코드 가독성을 향상시키고, 휴먼 에러로 발생할 수 있는 에러 처리를 컴파일 타임(compile time)에 처리하여 에러 처리에 대한 휴먼 에러를 미연에 ..
[TIL] Alamofire을 이용한 Token 갱신 적용 오늘은 Alamofire를 이용한 토큰(Token) 갱신에 대해 작성해보고자 합니다. RequestInterceptorAlamofire을 이용하여 토큰 갱신에 대해 구글링해보면 항상 등장하는 키워드는 RequestInterceptor입니다.Alamofire 공식 문서에 따르면 RequestInterceptor는 RequestAdapter 프로토콜과 RequestRetrier 프로토콜로 이루어진 프로토콜로 Session별 및 Request별 기능을 제공한다고 정의하고 있습니다. 이와 더불어 RequestInterceptor 프로토콜은 모든 네트워크 요청에 ​​공통 헤더가 추가되고 인증(Authentication) 이 만료되면 요청이 재시도되는 인증 시스템이 포함된다고 합니다. 여기서 RequestAdapt..
[TIL] TikTok 피드 구현 과정 소개본격적인 프로젝트에 들어가기 앞서 이번에 TikTok 피드처럼 UI를 구성하기 위해 따로 프로젝트를 만들어 미리 테스트 해본 과정을 소개하는 내용입니다. 참고 강의TikTok UI 에 대한 자료는 아래 강의를 기반으로 진행하였습니다.https://www.youtube.com/watch?v=j1w6Ed5-3tA 구현 과정위 강의 구현한 TikTok 피트 UI는 CollectionView를 이용하였습니다. 이는 CollectionView의 Cell이 TableView Cell보다 Size를 CollectionView Layout 설정을 통해 좀 더 명시적으로 지정해줄 수 있기 때문이라고 생각됩니다. 따라서 기본적으로 CollectionView를 구성해줍니다.  아래 코드는 Collection View를 ..
[TIL] Single에 대한 간단 내용 정리 RxSwift로 네트워크 코드 구성 Single에 대한 설명을 하기 앞서 우선 RxSwift스럽게 구성한 네트워크 통신 코드에 대해 이야기 하고자 합니다. 왜냐하면 이 코드를 기준으로 Single에 대해 설명할 예정이기 때문이죠. 다음 코드 스니핏은 RxSwift 스럽게 구성한 네트워크 코드입니다. static func fetchJoke() -> Observable { return Observable.create { observer -> Disposable in // 네트워크 통신에 관한 코드 작성.. return Disposables.create() } } 위 코드는 네트워크 통신을 위해 새로운 Observable을 생성하고, 또 네트워크 통신 결과로 Joke 타입의 인스턴스를 외부로 반환해 주고 있습..
[TIL] 스트림 공유 스트림 공유 스트림 공유란 말 그대로 스트림을 공유한다는 의미입니다. bind()의 스트림 공유 테스트 아래와 같이 코드를 구성 후 빌드를 해보겠습니다. let tap = signInButton.rx.tap .map { "안녕 \(Int.random(in: 1...100))"} tap .bind(to: emailTextField.rx.text) .disposed(by: disposeBag) tap .bind(to: passwordTextField.rx.text) .disposed(by: disposeBag) tap .bind(to: nicknameTextField.rx.text) .disposed(by: disposeBag) 그러면 빌드 결과로 아래와 같이 서로 다른 결과가 도출되는 것을 알 수 있습니다..