PHPickerController의 UTI 활용법
·
iOS
왜 PHPickerController가 세상에? 나오게 되었을까?🤔 🤔 iOS에서 사진을 가져오는 전통적인 방식은 UIImagePickerController였습니다.하지만 몇 가지 심각한 단점이 있었습니다:1. 프라이버시 문제 👿UIImagePickerController를 사용하려면 반드시 info.plist에 이런 설정을 추가해야 했어요:NSPhotoLibraryUsageDescription사진에 접근하려고 합니다. 위 사진은 오로지 본인을 위해 사용됩니다​UIImagePickerController로 앨범을 열면, 사실상 사용자의 전체 사진 라이브러리에 접근 권한을 요구해야 했습니다.앱 입장에서는 단순히 “사용자가 선택한 사진”만 필요하지만, 시스템은 모든 사진 접근 권한을 앱에 넘겨줘야 했죠.이..
포켓몬빵으로 이해하는 ObserverPattern & NotificationCenter
·
iOS
작년인가? 포켓몬 빵 대란이 일어진 사건을 기억하시나요???다들 띠부씰을 얻기 위해서 포켓몬빵 오픈런을 하면서 오박사님이 "ㅅㄱ!"를 외치거나 다른 사람들과 가위바위보까지 하는 사건이 일어났습니다 😱 그러면 포켓몬 빵 사려고 온 사람들은 어쩔수 없이 다시 집으로 갔다가 계속 "아 언제나와!!!" 하면서 주변 편의점 알바들을 괴롭혔죠. 갑자기 왜 포켓몬 빵이냐!! 바로 Observer Pattern을 사용했다면 당신은 오픈런을 하지 않아도 되었기 때문이죠!!!Observer Pattern 왼쪽이 이전에 계속 편의점들을 괴롭혔던 포켓몬 빵 사냥꾼들이었다면, 오른쪽은 편의점에서 지인들에게 "야 포켓몬빵 나왔어 빨리 가져가!!" 하고 알려주는 방식이에요. 이게 바로 Observer Pattern의 핵심입니다!..
내 아이폰에 터치를 해보았다(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..