일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- custombottomsheet
- claen architecture
- button configuration
- UIKit
- reactorkit
- swift 점선
- rxdatasources
- 타임라인 포맷팅
- swift concurrency
- coordinator
- custom ui
- BFS
- DP
- domain data
- task cancellation
- swift 백준
- SWIFT
- identifiable
- paragraph style
- swift custom ui
- tusit font 추가 방법
- swift bottomsheet
- swift navigationcontroller
- custom navigation bar
- Tuist
- swift dashed line
- RxSwift
- task cancel
- uikit toast
- traits
- Today
- Total
김경록의 앱 개발 여정
[RxSwift] RxSwift 본문
반응형 프로그래밍
- 데이터 흐름과 변화의 전파에 중점을 둔 프로그래밍 패러다임
- 데이터나 이벤트가 변경될 때 이러한 변경 사항이 자동으로 관련된 컴포턴트에 전파되도록 설계된 방식
RxSwift
- RxSwift는 swift를 위한 반응형 프로그래밍을 구현한 라이브러리
- 비동기 코드를 보다 간결하고 효율적으로 작성할 수 있게 해줌
- 우리가 항상 사용하던 escaping 키워드의 생략과 더불어 마치 리턴 값이 있는 함수를 사용하듯 편하게 비동기 코드를 작성 할 수 있는 툴.
공식문서에서
RxSwift의 의도는 관찰 가능한 객체와 이러한 비동기 작업을 변환하고 구성하는 메서드 모음 형태로 비동기 연산과 데이터 스트림을 쉽게 구성할 수 있도록 하는 것입니다.
KVO 관찰, 비동기 작업, UI 이벤트 및 기타 데이터 스트림은 모두 시퀀스 추상화에 따라 통합됩니다. 이것이 바로 Rx가 간단하고 우아하며 강력한 이유입니다.
라고 설명하고 있다.
( RxSwift's intention is to enable easy composition of asynchronous operations and streams of data in the form of Observable objects and a suite of methods to transform and compose these pieces of asynchronous work)
옵저버블
- 이벤트를 발생시키는 역할
- 비동기 이벤트를 관찰 가능한 형태로 만든 것
- 이벤트 발생시 item을 시퀀스로 방출
옵저버
- 옵저버블이 발생시키는 이벤트에 반응하는 역할
- Subscribe를 통해 옵저버블* 을 구독해서 이벤트를 받음
public func subscribe(
onNext: ((Element) -> Void)? = nil,
onError: ((Swift.Error) -> Void)? = nil,
onCompleted: (() -> Void)? = nil,
onDisposed: (() -> Void)? = nil
) -> Disposable
메서드 원형
옵저버블이 방출하는 아이템을 각 상황별로 처리함
해당 메서드로 클로저 넘겨 줄 경우 자체적으로 AnonymousObserver 생성,
해당 옵저버블을 자동으로 구독해준다
이 메서드 원형을 항상 사용하기엔 번거로움이 존재한다. 따라서 많은 sugar API를 제공하는데 아래 링크에서 확인가능하며
해당 링크에서 marble 이미지를 참고하면 동작을 이해하기 수월해진다
해당 그림은 자주 쓰이는 just메서드의 마블 이미지로, 생성 된후 complete된다는 걸 알려주고 있다.
또한,
알파벳 순으로 정렬되어있으며, 볼드 처리 된 오퍼레이터가 원형임을 나타낸다.( Buffer가 원형이고, BufferWithCount는 Buffer + @ 인것)
Disposable, dispose()
- 메모리 릭 방지를 위한 설계를 필요로함
- 더 이상 구독할 필요가 없는 경우 사용
- 일반적으로 직접 호출을 권장하지않음
→ DisposeBag,takeUntil을 사용 권장 - ex) 뷰컨이 없어져도 dispose해주지 않으면 구독은 사라지지않고 계속 일할 수 있음 → 뷰컨이 deinit 될 때 일일이 dispose 해줘야함
DisposaBag
- ARC같은 역할을 해줌
- 해제해야줘야 하는 리소스가 많아졌을때의 불편함을 감소시켜줌
- disposable을 담는 배열
- disposed(by bag: DisposeBag) 메서드를 통한 배열 사용
- 내부적으로 Bag자체가 deinit이 되는 순간 dispose를 호출, 각 해당 객체이 생명 주기에 맞춘 리소스의 해제 지원
- ex) 뷰컨에 DisposeBag을 담아놓으면 뷰컨이 deinit될 때 자동으로 전부 dispose() 됨
Traits
- 특정 작업을 더 명확하고 간결하게 수행하기 위해 고안된 옵저버블
대표적으로 Single, Maybe, Completable 이 있음
Single
- 하나의 값 또는 에러를 방출하는 옵저버블
- 네트워크 요청과 같은 단일 값을 생성하는 작업에 적합
- success 또는 error를 방출
- success는 하나의 값과 함께 전달 됨
Maybe
- Success, Completed, Error 를 방출할 수 있는 옵저버블
- 싱글과 유사하지만 값 없이 성공적으로 완료될 수 있는 경우에 사용
Completable
- 작업의 완료 또는 실패만을 알리는 옵저버블
- 값의 생성 X
- 파일 작성 또는 데이터 베이스 업데이트와 같은 결과 값을 반환할 필요가 없는 경우
ControlEvent
- RxCocoa에서 주로 사용됨
- UIControl Event 를 위한 특별한 옵저버블
특징
- 메인 스레드에서만 작동, UI업데이트시 스레드 문제를 방지함
- 에러 이벤트 방출X
- dispose 처리 필요 없음 → 자동으로 구독 해제 → 메모리 누수 방지
이 외에도 많이 있지만 주요 operator는
1. 생성 (Creating Observables)
just: 단일 요소를 포함하는 Observable 시퀀스를 생성합니다.of: 고정된 수의 요소들을 포함하는 Observable 시퀀스를 생성합니다.
from: 배열, 딕셔너리와 같은 컬렉션 타입을 Observable 시퀀스로 변환합니다.
create: Observable을 수동으로 생성할 때 사용합니다. 이벤트를 커스텀할 수 있습니다.
deferred: Observable을 생성하는 팩토리 함수를 제공하여, Observable이 구독될 때마다 새로운 Observable을 생성합니다.
2. 변형 (Transforming)
map: 각 요소에 함수를 적용하여 결과를 반환합니다.
flatMap: Observable 요소를 다른 Observable로 변환하고, 결과적으로 나오는 Observable들을 하나의 Observable 시퀀스로 병합합니다.
scan: 축적된 결과를 포함하는 Observable을 생성하기 위해 각 요소에 함수를 적용합니다.
3. 필터링 (Filtering)
filter: 조건에 맞는 요소만을 방출합니다.
distinctUntilChanged: 연속적으로 중복된 요소를 제거합니다.
take: 시작부터 지정된 수의 요소만을 방출합니다.
skip: 시작부터 지정된 수의 요소를 건너뜁니다.
4. 결합 (Combining)
merge: 여러 Observable에서 방출된 요소들을 하나의 Observable로 병합합니다.
concat: 여러 Observable을 순서대로 이어 붙여서 하나의 Observable 시퀀스로 만듭니다.
zip: 여러 Observable에서 방출된 요소들을 순서대로 짝지어줍니다.
combineLatest: 여러 Observable 중 하나라도 새로운 요소를 방출할 때마다, 각 Observable의 마지막 요소를 결합하여 방출합니다.
5. 오류 처리 (Error Handling)
catch: 오류가 발생했을 때, 다른 Observable로 대체합니다.
retry: 오류가 발생했을 때, Observable 시퀀스를 재시도합니다.
자세한 내용은 공식문서 참조
참조: ReactiveX - Operators
'TIL' 카테고리의 다른 글
[ReactorKit] 공식문서 훑어보기 (0) | 2025.01.09 |
---|---|
[RxSwift] RxSwift에서 얘기하는 시퀀스 (0) | 2025.01.09 |
[Swift] 코디네이터 패턴과 TabBar에서의 코디네이터 활용 (0) | 2025.01.09 |
[CS] 바이너리 파일이란? (0) | 2025.01.09 |
[Swift] 예약어를 변수로 사용하기 (백틱 ` `) (0) | 2025.01.09 |