[RxSwift] Traits
2022. 12. 28. 16:47
iOS/RxSwift
Traits란 기존의 Observable의 wrapper 구조체로, 더 제한적인 기능을 수행하는 Observable이다. public typealias Single = PrimitiveSequence public typealias Completable = PrimitiveSequence public struct PrimitiveSequence { let source: Observable init(raw: Observable) { self.source = raw } } 즉, Observable보다 좁은 범위의 기능을 수행하기에, Traits를 사용하지 않고 Observable로 커버가 가능하지만, 코드가 더 명확해진다는 장점이 있다. Single 기존 Observable에서는 next, completed,..
[RxSwift] Operator(2) - Transforming
2022. 12. 27. 18:35
iOS/RxSwift
이번 포스팅에서 살펴볼 연산자는 Observable을 통해 방출되는 item들을 변형해주는 연산자에 대해 알아보자. toArray onCompleted 이벤트 전까지, next 이벤트를 통해 전달된 데이터를 배열로 묶어 한번에 방출한다. toArray() 연산자를 거치게 되면, Single 타입으로 바뀌게 된다. Single 타입은 success, failture이벤트만 전달하기 때문에, subscribe 메서드에서 onCompleted, onNext 가 아닌 onSuccess, onFailure를 통해 이벤트를 받는다. let publish = PublishSubject() publish .toArray() // Single 타입으로 리턴됨. .subscribe( onSuccess: { print($0..
[RxSwift] Operator(1) - Filtering
2022. 12. 25. 15:16
iOS/RxSwift
이번 포스팅에서는 RxSwift의 Operator중에서 Filtering에 관련된 Operator들에 대해 알아보자. Filtering Operator를 통해 next 이벤트를 통해 받는 데이터를 선택적으로 취할 수 있다. Ignoreing Operators ignoreElements() 마블 다이어그램을 보면 알 수 있듯이, next를 통해 전달된 모든 데이터를 무시한다. 여기서 주의할 점은 next를 통해 들어온 이벤트만 무시하고, completed, error 이벤트들은 정상적으로 전달되어 스트림이 끊기게 된다. //Cold Observable의 경우 func observable() -> Observable { return Observable.create { observer in observer.o..
[RxSwift] Subjects
2022. 12. 1. 01:29
iOS/RxSwift
이번 포스팅에서 알아볼 Subject를 알아보기에 앞서, HOT Observable과 COLD Observable에 대해 알아보자! Cold Observable & Hot Observable Cold Observable이란 구독이 되기 전까지 동작하지 않다가, 구독이 되면, 모든 데이터를 한번에 방출한다. Cold Observable을 marble diagram으로 표현하면 아래와 같다.(점선은 구독을 의미한다) 지금까지 알아보았던 Observable이 Cold observable이다. 또한, Unicast방식으로 동작하여, Subscriber(Observer)마다 고유의 Stream이 생성된다. Hot Observable은 구독 여부와 상관없이 방출할 데이터가 있으면 방출한다. 구독이 되면, 모든 데이..
[RxSwift] Observable(2) - Creating Observable
2022. 11. 28. 00:21
iOS/RxSwift
이번 포스팅에는 Observable을 생성하는 Operator 몇 가지에 대해 알아보자! Marble Diagram Operator를 이해하기 앞서, 이 marble diagram에 대해 알 필요가 있다. 실제 ReactiveX에 들어가서 여러 Operator들을 보게 되면, Operator들의 동작을 Marble Diagram을 통해 표현한다. .just() 우선, marble diagram 부터 살펴보자 just 연산자는 marble diagram으로 이해해보면, 데이터가 들어와서(빨간 구슬), Just Operator를 거치게 되면, 데이터를(빨간 구슬)을 방출하는 Observable을 생성하고, 바로 Completed된다. let observable = Observable.just(1) //Obs..
[RxSwift] Observable(1)
2022. 11. 27. 01:03
iOS/RxSwift
이번 포스팅에서는 RxSwift에서 핵심이라고 할 수 있는 Observable에 대해서 알아보자 Observable의 사전적 정의는 "관찰 가능한" 인데, 저번 포스팅에서 말했듯이, Observable은 관찰 가능한 시퀀스를 통해! 이벤트를 방출 한다. 이러한 이유 때문에, RxSwift에서는 이 Observable을 sequence, Observable Sequence라고도 부른다. Observable은 이 이벤트를 방출할때, 비동기로 이벤트를 방출한다! Observable 생명 주기 우선 Observable은 3가지 종류의 이벤트를 방출 할 수 있는데, next error completed 실제 Observable의 이벤트를 보면 @frozen public enum Event { /// Next el..
[Swift] Memory Leak(2) - Closure의 [weak self]
2022. 11. 26. 00:24
iOS/Swift
저번 포스팅에서 순환 참조와 ARC에 대해서 알아보았다. 이제 이러한 순환 참조가 실제로 일어나는 예시에 대해 살펴보자 Clousuer 우리는 흔히 클로져 에 [weak self] 키워드를 쓰는 것을 알 수 있다! 이것을 왜 사용하는 지 알아보기 전에 "Closure Capture"라는 것에 대해 알 필요가 있다. Closure Capture Closure는 주변 Context로 부터 상수나 변수를 Capture할 수 있는데, 먼저 예제를 살펴보자! func makeIncrementer(forIncrement amount: Int) { var runningTotal = 0 let closure = { runningTotal += amount print(runningTotal) } closure() clo..
[Swift] Memory Leak(1) - 약한 참조, 강한 참조, unowned 참조
2022. 11. 25. 18:03
iOS/Swift
이번 포스팅에서는 ARC와 메모리 누수가 언제 일어나는지 알아 보도록 하자 ARC ARC란 Automatic Reference Counting의 약자로, 말 그래도 Reference를 counting 하여, 자동으로 메모리를 관리 한다. 또한 Reference라는 키워드에서 볼 수 있듯이, 클로져나, 클래스와 같은 Reference 타입에 대해서만 관리 하며, enum, struct와 같은 Value 타입에 대해서는 관리하지 않는다. 이들은 retain 이라는 함수를 호출하여 Reference Count를 증가 시키고, release라는 함수를 호출하여 Reference Count를 감소 시킨다. 최종적으로 reference count가 0이 될때 자동으로 메모리에서 해제 해준다. class Person..
[RxSwift] RxSwift란?
2022. 11. 25. 01:37
iOS/RxSwift
Rx란, Reactive eXtension의 줄임말로, Observable(관찰 가능한) 시퀀스를 사용하여, 비동기식 프로그램 혹은 이벤트 기반 프로그램을 구성하기 위환 오픈 소스 라이브러리이다. 또한, 이런 관찰 가능한 시퀀스를 지원하기 위해 Observer 패턴을 사용한다. 아마 해당 문장의 이해가 쉽지 않을 것이다. 이제 이 문장을 천천히 이해해보자! 비동기 프로그래밍 네트워크 통신과 관련한 로직을 "동기적" 으로 짜게 되면, 아래와 같이 앱의 UI업데이트가 멈추는 현상을 발견할 수 있다. 이러한 이유 때문에, 비동기 프로그래밍이 중요한데, 위의 예시를 GCD와 Closure를 통해 비동기 방식으로 짜게 되면, func downLoadJson(_ url: String, _ completionHand..
[iOS] View Update Cycle(2) - layout, constraints, display
2022. 11. 19. 16:57
iOS/iOS
지난 포스팅에서 Main Run Loop과 Update Cycle에 대해 알아보았다. 이 Update Cycle은 view들을 layout, constraints, display 하는 작업을 담당하였다. Auto Layout에서 이들은 3단계를 거치게 되는데 Constraints: 시스템은 모든 constraints를 계산하고 설정한다. Layout: View의 배치하고, subview를 배치한다. Display: 필요한 경우 다시 그린다. 이번 포스팅에서는 layout, constraints, display가 어떻게 진행되고, 어떠한 메서드들이 있는지 알아보자 Layout view들의 position과 size들을 의미한다. view들의 Layout 변화는 layoutSubViews() 메서드에서 진행..
[iOS] View Update Cycle(1)
2022. 11. 18. 15:01
iOS/iOS
오늘 포스팅에서는 View가 어떻게 그려지는지에 알아보자 View가 어떻게 알아보기 이전에 Main Run Loop과, Update Cycle에 대해 알 필요가 있는데, 이에 대해 먼저 알아보자. Main Run Loop 우선 Run Loop이란, input source와 timer source 라는 2종류의 이벤트를 처리하는 루프이다. (input source는 소켓, 키보드, 마우스, 터치 등의 입력 소스) 이는 Thread를 생성시 자동으로 생성이 되며, 실행 시키기 위해서는 직접 코드를 통해 실행을 해야한다. Main Run(event) Loop은, Main Thread에서 실행되는 Run Loop으로, UIApplicaion 객체에 의해 자동으로 실행된다. 즉, 일반 Run Loop가 다르게 직..
[Swift] Initializer(3) - required init?(coder:)
2022. 11. 10. 16:57
iOS/Swift
UIView와 UIViewController에서 designated Initializer를 정의하게 되면, 아래와 같은 에러를 보게된다. 'required' initializer 'init(coder:)' must be provided by subclass of 'UIView' 이 required init?(coder:)에 대해서 알아보도록 하자! 에러가 나는 이유 UIViewController와 UIView는 NSCoding이라는 protocol을 채택하고 있는데, NSCoding protocol은 아래의 method를 구현하도록 한다. func encode(with coder: NSCoder) { } required init?(coder: NSCoder) { } 저번 포스팅에서 말했듯이, requir..