일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- java
- SWIFT
- 영화리뷰
- 백준
- sopt 35기
- 프로그래머스
- 플러터
- 코딩공부
- 리뷰
- 오블완
- toy project
- 영화기록
- inflearn
- 새벽녘 소소한 기록
- 영화일기
- 자바공부
- sopt ios
- 티스토리챌린지
- 일기
- 키노
- 자바
- 토이프로젝트
- 자바 스터디
- 영화
- Flutter Toy Project
- 영화후기
- Flutter
- SOPT
- 인프런
- 스프링 입문
- Today
- Total
새벽의 기록
[SOPT] RxSwift 스터디 #1 본문
RxSwift의 약자는 Reactive Extension + Swift 그리고 RxSwift의 깃허브에는 Reactive Programming in Swift라고 되어있다.
Reactive Programming, 즉 반응형 프로그래밍이란
→ 데이터의 흐름 및 변경사항을 전파하는 데 중점을 둔 프로그래밍 패러다임
→ 주변환경/데이터에 변화가 생길 때 연결된 실행 모델들이 이 이벤트를 받아 동작하도록 설계하는 방식
RxSwift는 반응형 프로그래밍이기 때문에 어떤 비동기 이벤트에 대해 관찰 가능한 형태로 만들고 이를 관찰하는 놈이 있을 경우,
이 비동기 이벤트의 변화에 따른 전파를 받는다.
여기서 관찰 가능한 형태가 Observable, 관찰하는 놈이 Observer
관찰 가능한 형태 Observable
RxSwift의 Observable이란 것에 대한 정의를 보면 제네릭 클래스로 구성되어 있다.
즉, 어떤 비동기 이벤트를 관찰 가능한 형태로 만든다는 것은 그 비동기 이벤트를 제네릭 타입의 Observable 클래스 인스턴스로 만든다는 뜻
예를 들어 UIButton의 경우, 이 버튼의 클릭 이벤트가 사용자에 의해 언제 발생할지 선언할 당시에는 모른다.
→ 따라서 버튼은 비동기 이벤트에 해당
버튼이 클릭된다는 것은 데이터에 변화가 생긴다는 것!
그렇다면 이 데이터의 변화를 전파하기 위해선 이 버튼 클릭 이벤트가 관찰 가능한 형태가 되어야함!
→ 이 역할을 RxSwift에서 Observable로 수행
비동기 이벤트를 관찰 가능한 형태로 만든 것이 바로 Observable이고, 이 Observable은 실제 그 비동기 이벤트가 일어났을 때, 이를 알리기 위해 그 이벤트에 대한 항목(item)을 관측 가능한 순차적 형태로 방출한다.
그럼 이 방출된 항목들을 누가 받냐면,
관찰하는 놈 Observer
Observer가 받는다.
Observer는 Observable을 구독한다.
Observer는 내가 원하는 비동기 이벤트를 방출하는 Observable이 있을 때 해당 "Observable을 구독" 함으로써 그 Observable이 비동기 이벤트가 실행 되어 항목(item)을 방출 했을 때 그 항목을 받을 수 있다.
이 항목은 onNext, onError, onCompleted 이렇게 3가지가 있다.
Observer는 내가 구독하려는 Observable이 항목을 방출 했을 때 어떤 작업을 할 것인지, 만약 해당 Observable이 오류가 발생했다면 어떤 작업을 할 것인지, 더 이상 이벤트가 발생하지 않고 종료됐을 때는 어떤 작업을 할 것인지를 subscribe의 메서드 파라미터를 통해 넘겨준다.
정리하자면,
비동기 이벤트를 관찰 가능한 형태로 만든 것이 Observable,
Observable은 해당 비동기 이벤트가 발생했을 때 항목(item)을 방출함
관찰 가능한 형태인 Observable을 관찰하는 것이 Observer,
Subscribe(onNext:...) 메서드를 통해 Observable를 구독할 수 있는데,
Observable에서 항목이 방출됐을 때, 에러가 났을 때, 이벤트가 종료됐을 때 3가지 경우로 처리할 수 있음
근데 그럼 만약, 내가 만약 더이상 이 Observable에 대한 이벤트를 받고 싶지 않아서 "구독을 해제"하고 싶을 땐 어떻게 해야하지??
Disposable
disposable을 사용한다.
func subscribe(_ on: @escaping (Event<Element>) -> Void) -> Disposable
위에서 공부한 subscribe의 원형을 보면 return 타입이 Disposable 인데
이는, 해당 Observable의 이벤트가 더이상 필요하지 않을 때 해당 구독을 취소할 수 있는 수단인 Disposable이란 타입의 값을 리턴해 준다는 뜻
이해하기 쉽게 순서대로 나열해보자면,
- Observer가 어떤 Observable의 이벤트를 받고 싶을 경우 Subscribe 메서드로 "구독"을 통해 받는다.
- 근데 더이상 이벤트를 받고 싶지 않아서 "구독을 해제"할 경우를 대비해 Subscribe 메서드는 Disposable이란 타입의 리턴 값을 줌
- 이 Disposable은 dispose 메서드를 가지고 있는데, 만약 Observable이 방출하는 이벤트를 더이상 받고 싶지 않은 경우, Subscribe를 했을 때 얻은 이 Disposable에 대고 dispose() 메서드를 호출해서 해당 Observable에 대한 구독을 해제 할 수 있음
구독을 끊기 위해 dispose를 하는 가장 중요한 이유 중 하나는 메모리 누수 방지
disposeBag 이용해서 한 번에 여러개의 구독 끊을 수도 있음
iOS 앱에서, 인터넷을 통해 파일을 다운로드 하는 흐름을 Observable의 생명주기를 생각해오기 (간단한 예시 코드까지)
- Observable 생성: 파일 다운로드 요청을 Observable로 만들기.
- 구독 시작: Observable을 구독해서 다운로드 시작.
- 이벤트 방출: 다운로드 진행 중 next.
- 종료: 다운로드가 완료되면 completed. 오류가 발생하면 error.
- 구독 해제: 다운로드 완료 후 dispose로 구독 해제.
let disposeBag = DisposeBag()
downloadFile()
.subscribe(
onNext: { file in
print("Downloaded \\(file)")
},
onError: { error in
print("Error: \\(error)")
},
onCompleted: {
print("Download completed")
}
)
.disposed(by: disposeBag)
'SOPT > RxSwift 스터디' 카테고리의 다른 글
[SOPT] RxSwift 스터디 #2 (0) | 2024.11.21 |
---|