내 아이폰에 터치를 해보았다(Reverse-preorder DFS)
·
iOS
iPhone 화면을 터치했을 때 정확히 어떤 일이 일어날까요??오늘은 iOS에서 터치 이벤트가 어떻게 흘러가는지, 왜 그런 방식으로 설계되었는지에 대해 자세히 알아보겠습니다! 💻터치 이벤트의 주요 구성 요소UITouch란?UITouch는 화면에서 발생하는 터치의 위치, 크기, 움직임, 압력 등을 나타내는 객체입니다.터치가 시작되면 UITouch 인스턴스가 생성되고, 손가락이 화면에서 떨어질 때까지 계속 유지됩니다.이게 중요한 이유는 iOS가 터치를 "연속된 하나의 이벤트 스트림"으로 처리하기 때문이에요.UITouch는 다음과 같은 5가지 상태를 가져요:.began: 손가락이 처음 화면에 닿은 순간 (딱 한 번만 발생).moved: 손가락이 화면에서 움직일 때.stationary: 손가락이 화면에 있지만..
SceneDelegate가 UIResponder를 상속하는 이유
·
iOS
왜 갑자기 UIScene이 등장했을까?iOS 13이 출시되면서 가장 큰 변화 중 하나가 바로 UIScene의 도입이었습니다.왜 Apple이 기존에 잘 작동하던 AppDelegate 구조를 바꿔가며 이런 복잡한 시스템을 도입했을까요? 🤔 핵심은 iPadOS의 멀티윈도우 지원 때문입니다.기존 iOS에서는 하나의 앱이 하나의 화면(window)만 가질 수 있었지만, iPadOS부터는 하나의 앱이 여러 개의 윈도우를 동시에 띄울 수 있게 되었거든요.예를 들어, Safari 앱을 두 개의 윈도우로 띄워서 하나는 YouTube를 보고 다른 하나는 문서를 작성하는 식으로 말이죠.이런 상황에서 기존의 AppDelegate 하나로는 여러 개의 윈도우 생명주기를 관리하기가 까다로웠습니다. 그래서 🍎은 이렇게 역할을 분..
RxSwift(9) - Scheduler
·
iOS/반응형프로그래밍
🧐Scheduelr?Swift에서 멀티스레딩은 주로 GCD를 통해 처리합니다. 반면 RxSwift에서는 Scheduelr라는 추상화된 개념을 사용합니다.하지만 scheduler != threadScheduler와 쓰레드 관계하나의 쓰레드에 여러개의 스케쥴러가 존재할 수 있고여러개의 쓰레드에 하나의 스케쥴러가 존재할 수 있습니다.Scheduler종류CurrentThreadScheduelrpublic class CurrentThreadScheduler : ImmediateSchedulerType { public static let instance = CurrentThreadScheduler()}: 기본 스케쥴러로, Serial Schduler로 동작합니다. MainSchedulerpublic fina..
RxSwift(8)-에러처리
·
iOS/반응형프로그래밍
에러와 Observable 존재Observable에서 에러가 발생하면 해당 시퀀스는 즉시 종료됩니다.// 에러 발생 시 Observable의 동작someObservable .subscribe( onNext: { value in print("값: \(value)") }, onError: { error in print("에러 발생: \(error)") // 이 시점에서 Observable은 종료됨 }, onCompleted: { print("완료") // 에러 발생 시 이 부분은 실행되지 않음 } )실무에서 흔히 발생하는 에러 상황은 뭐가 있을까..
RxSwift(7)-BehaviorRelay
·
iOS/반응형프로그래밍
BehaviorSubjecthttps://codeisfuture.tistory.com/125 RxSwift(2)-Subject1. Subject란?RxSwift에서 Subject는 Observable과 Observer의 특성을 모두 갖춘 하이브리드 요소입니다. Observable처럼 값을 방출할 수 있으며, 동시에 Observer처럼 다른 Observable을 구독할 수도 있습니다.흠...codeisfuture.tistory.com를 기억하시는가??? 아주 초반에 공부했던것이다. combine의 CurrentValueSubject와 비슷한 것으로 초기값을 가지고 구독시 최신 값을 즉시 수신하고 onNext, onError, onCompleted호출이 가능했다. BehaviorRelayBehaviorRel..
RxSwift(6)-RxCocoa(bind, drive, DelegateProxy)
·
iOS/반응형프로그래밍
RxCocoa?iOS, macOS 등 모두에 적용이 가능한 프레임워크로, Cocoa 프레임워크 위에서 관련 기능들을 모두 구현할 수 있습니다.즉 RxSwift = 반응형 프로그래밍의 기본 개념과 연산자 제공?RxCocoa = 이를 UIkit 컴포넌트들과 자연스럽게 통합할 수 있게 해줍니다.RxCocoa는 UIKit 컴포넌트들에 rx 네임스페이스를 제공하여 반응형 확장을 가능하게 합니다. 예를 들어 textField.rx.text나 button.rx.tap과 같은 방식으로 UI 이벤트를 Observable 스트림으로 변환할 수 있습니다.🔄 반응형 프로그래밍의 기본: subscribeRxCocoa의 바인딩 개념을 이해하기 전에, 기존 RxSwift의 기본적인 이벤트 구독 방식을 복습해보겠습니다.observ..
RxSwift(5)-TimeBasedOperators
·
iOS/반응형프로그래밍
Buffering Operators시간 기반 작업을 할 때 가장 자주 마주치는 문제가 바로 "이벤트를 어떻게 모아서 처리할까?"인데요.사용자가 버튼을 연타한다거나, API 호출을 너무 자주 하게 되는 상황을 생각해보시면 이해가 쉬울 거예요.Replay(_:)Replay는 새로운 구독자에게 과거에 방출된 이벤트들을 다시 전달해주는 연산자입니다. 왜 이게 필요할까요?예를 들어 사용자가 앱에서 로그인을 했는데, 로그인 상태를 여러 화면에서 동시에 참조해야 하는 상황을 생각해보세요.로그인 Observable이 이미 성공 이벤트를 방출했다면, 나중에 구독하는 화면들은 그 정보를 받을 수 없겠죠?// 마지막 2개의 이벤트를 새 구독자에게 전달let replayedObservable = Observable.inter..
RxSwift(4)-Combining Operators
·
iOS/반응형프로그래밍
이번에는 여러 Observable 시퀀스를 하나로 결합하거나, Observable과 다른 소스의 데이를 통합하는 연산자를 알아보겠습니다~이는 여러 이벤트 스트림을 관리하고 동기화해야 하는 복잡한 상황에서 유용합니다.startWith(_:)생성되어 방출되는 옵저버블에 대해 초기값을 줄 수 잇습니다.// 네트워크에서 데이터를 로드하기 전에 캐시된 데이터 먼저 표시loadFromNetwork() .startWith(loadFromCache()) .bind(to: tableView.rx.items) .disposed(by: disposeBag)초기 상태 또는 기본값을 제공하는데 유용할것같다.concat(_:)여러 옵저버블 시퀀스를 순서대로 합쳐줍니다.사실 합쳐진다느낌보다는 순서대로 진행한다? 가..
RxSwift(3)-Filtering Operators & TransForming Operators
·
iOS/반응형프로그래밍
next 이벤트를 통해 넘어온 값들에 대해 필터를 해줘 해당 오퍼레이터를 통해 넘어온 값들에 대해 다 처리하지 않고 원하는 값만 골라 처리할 수 있어지는 기능에 대해 살펴보겟습니다이것도 4가지 종류가 있습니다.. 자주 나오는것 같다 4.4..1. Ignoring OperatorignoreElement()값들이 방출되어도 무시되고 스트림에 등록되지 않는다. 하지만 error나 completed는 무시하지 않습니다.example(of: "ignoreElements") { // 1 let strikes = PublishSubject() let disposeBag = DisposeBag()// 2 strikes .ignoreElements() .subscribe { _ in print..