본문 바로가기

분류 전체보기

(35)
[RxSwift] subscribe(on:)과 observe(on:)의 차이를 아시나요? RxSwift로 개발을 하다보면,  특정 옵저버블이 옵저버에게 전달해주는 이벤트를 처리하는 작업을  특정쓰레드에서 진행되도록 해야하는 경우가 있습니다.  UI관련 로직이라면 반드시 메인쓰레드에서 해당 작업이 이뤄나도록 해야하는 것 처럼요.  Rx는 Scheduler라는 것을 사용하여 멀티 쓰레드 환경을 관리합니다.  먼저 Rx에서 Scheduler가 의미하는 것이 어떤 것인지 살펴봅시다.  Scheduler  MainScheduler,ConcurrentDispatchQueueScheduler,SerialDispatchQueueScheduler,OperationQueueScheduler,ImmediateScheduler,CurrentThreadScheduler  우선 Rx에는 다양한 스케쥴러가 존재하는데요..
[자료구조] 해시 테이블(+Swift) 안녕하세요 오늘은 자려구조중 해쉬테이블에 대해 다뤄보겠습니다. 어떤 개발자에게 "해시테이블을 모르면 개발자가 아니다." 라는 말을 들은적이 있는데요. 해시테이블 개념에 대해 정리해보고, Swift에서는 어떻게 활용할 수 있을지 알아보겠습니다.   해시 테이블해시 테이블은 key, value쌍으로 이루어진 자료구조입니다.  내부적으로 배열을 사용하여 구현됩니다. key값을 배열의 인덱스로 변경하기 위해 해시함수를 사용합니다. 해시함수마다 성능의 차이는 존재하지만, 서로다른 키 값에 대해서 같은 해쉬값이 생기게되어 충돌(collision)이 발생할 수 있습니다. 해당 경우를 해결하기 위한 방법들은 다음과 같습니다.   체이닝특정 해시값이 가리키는 공간을 링크드 리스트의 시작점으로 하고 충돌이 발생하는 경우 ..
[트러플 슈팅] viewDidLoad의 호출시점 안녕하세요 iOS 개발을 하며 겪게되는 문제들을 정리하기 위해 앞으로 트러블 슈팅과 관련된 글을 적어보려고 합니다. 목차는 다음과 같습니다. 발생한 문제해결회고 발생한 문제  저는 지금 MVVM디자인 패턴을 사용하여 개발을 진행하고 있습니다. ViewModel과 ViewController를 바인딩 시켜주기 위한 시점으로 ViewDidLoad가 호출되는 시점을 그 시점으로 하자고 판단하였습니다. 현재 프로젝트에서는 RxSwift를 사용하여 옵저버 패턴을 구현하고 있습니다.public extension Reactive where Base: UIViewController { var viewDidLoad: ControlEvent { let source = self.methodInvoked(#selecto..
[프로그래밍] 생각하는 프로그래밍 칼럼2: 아하! 알고리즘 안녕하세요 최근에 "생각하는 프로그래밍" 이라는 책을 읽게되었는데요 해당책을 읽으며 생각했던 내용들을 조금씩 정리해 보려고 합니다.  개요챕터의 제목은 "아하! 알고리즘" 인데요, 이것은 특정 알고리즘을 명칭하는 것이 아니라, 문제를 해결하는 방법을 해결하는 알고리즘을 떠올리는 순간인 아하 모먼트를 의미합니다. 그리고 해당 순간은 깊은 연구가 아닌 문제에 대해 고민하는 개발자라면 누구든 해당 순간이 찾아올 수 있다고 합니다. 이번챕터는 어려운 문제를 간단하게 바라볼 수 있는 방법을 제시해줄 것 같습니다.    해당 칼럼에서는 세가지 문제를 던집니다. 해당 문제를 하나하나씩 살펴보겠습니다. 문제1: 빠진 수 찾기최대 40억개의 32비트 정수가 랜덤한 순서로 들어있는 순차파일이 있을 때, 해당 파일에 포함되..
[Swift] GCD와 Swift concurrency에 대해 안녕하세요 비동기 프로그래밍에 대해 공부한 내역을 정리해 보려고 작성한 포스팅입니다. 기본적으로 iOS프로그래밍은 2가지 비동기 처리방식을 제공합니다. 바로 GCD와 비교적 최근에 도입된 Swift concurrency입니다. 무언가 새로운 것을 만들어 냈다는 것은 기존의 문제를 해결자는 의지에서 나온다고 생각합니다. 따라사 애플이 Swift concurrency를 통해서 해결하고자 했던 문제가 무엇이었는지에 대해 다뤄 보려고 합니다. ※ 쓰레드는 특정시점에 하나의 작업을 실행할 수 있으며, 작업의 단위는 코드 블록(하위블록 포함)이다. GCD오브젝티브C 부터 사용된 비동기 프로그래밍 방식입니다. GCD는 DispatchQueue를 통해 작업을 조율합니다. 등록된 작업들을 FIFO방식으로 쓰레드를 사용..
[RxSwift] self순환 참조에 대해 안녕하세요 주니오스입니다. 오늘은 RxSwift에서 평소에 습관처럼 사용했던 동작에 대해 한번 자세하게 다루어 보려고합니다.  옵저버블에 대한 구독을 클래스타입 내부에서 진행하고, 내부 프로퍼티를 이벤트를 수신함으로써 수정하고 싶은 경우 위와 같은 패턴을 사용하여 순환참조를 막습니다. 변경되는 부분이 많아지는 경우 self를 많이 사용해야 하기 때문에 매우 귀찮은 작업입니다. 우선 self를 캡쳐해야 하는 이유에 대해 알아보겠습니다. 명시적 Self를 요구하는 이유 클로저나 매서드나 모두 함수인데 우리는 매서드에서 프로퍼티를 수정하는 경우 self를 사용하지 않는 다는 것을 알고 있습니다.  본론부터 말씀드리면, subscribe에 전달된 클로자는 궁극적으로 탈출클로져에 전달되게 됩니다. 따라서 함수블록..
[iOS공통] Coordinator패턴을 적용한 페이지 전환 구현 안녕하세요 🙌 최근 진행하고 있는 프로젝트에서 뷰계층에 상관없이 특정화면을 띄울 필요가 있었습니다. Present를 사용하는 방법도 있지만, 화면이 많아짐에 따라 화면전환과 관련된 비즈니스 로직을 담당하는 객체를 명확하게 지정해줄 필요가 있다고 생각하였습니다. 예를들어 로그인화면에서 로그인을 성공하면 메인 화면으로 이동하고, 실패하면 비밀번호 재설정등과 같은 화면으로 이동하는 것과 같은 로직을 의미합니다. 이러한 로직을  Coordinator라는 객체를 통해서 관리하는 것이 Coordinator패턴입니다. 코디네이터 패턴을 구현하는 방법은 사람마다, 프로젝트마다 조금씩 다르지만 보통 Coodinator는 ViewController를 가지며 start매서드를 사용하여 해당 ViewContoller를 뷰계..
[UIkit] 키보드 어보이던스(with 카카오톡 채팅방 만들기) 안녕하세요! 우리가 카카오톡을 사용할 때 아래 영상처럼 채팅을 치기 위해선 키보드(소프트)를 사용해야합니다.  영상을 자세히 보시면 키보드가 채팅이 입력되는 공간을 가리지 않고 밀어내는 것을 확인할 수 있습니다. 이런 동작을 Keyboard Avoidance라고 합니다. 일전 SwiftUI를 사용하여 키보드 어보이던스를 피하는 글을 작성한 적이 있었는데요 UIKit같은 경우 SwiftUI와 달리 키보드 어보이던스가 자동으로 실행되지 않습니다.(자동으로 키보드 어보이던스가 적용되는 SwiftUI는 해당 기능을 끄는 것이 까다롭습니다.. UIKit 최고 🙌) 아래 영상은 제가 직접 구현한 채팅창 화면입니다.  먼저 입력영역은 UITextView로 구현하였습니다. 카카오톡같은 경우는 멀티라인 입력을 지원하기..