subscribe : 구독의 의미로 만들어진 Observable을 방출할 수 있게 해줌
dispose : subscribe를 취소
- DisposeBag → 구독하고 난 뒤 disposebag에 넣고 나중에 필요할 때 한번에 방출
- 메모리 누수 방지에 용이
import UIKit
import RxSwift
print("---just---") // 원소 하나만
Observable<Int>.just(1)
.subscribe(
onNext: {
print($0)
}
)
print("---Of---") // 원소 여러 개
Observable<Int>.of(1,2,3,4,5)
.subscribe(
onNext: {
print($0)
}
)
print("---from---") //array 형태
Observable.from([1,2,3,4,5])
.subscribe(
onNext: {
print($0)
}
)
Observable.range(start: 1, count: 9) //범위
.subscribe(
onNext:{
print("2 * \($0) = \(2*$0)")
}
)
let disposBag = DisposeBag()
// 직접적인 코드 구현을 통해 옵저버 메서드를 호출하여 옵저버블을 생성
Observable.create{ observer -> Disposable in
observer.onNext(1)
observer.onCompleted()
observer.onNext(2)
return Disposables.create()
}
.subscribe{
print($0)
}.disposed(by: disposBag)
→ 좁은 범위의 Observable ( 코드 가독성을 위해 )
→ 유저가 작업할 동안 자료가 저장될 때, 저장이 완료되어 간단한 알림을 보내거나 에러가 발생했을 때 사용
print("======single======")
struct SomeJSON : Decodable {
let name: String
}
enum JSONError : Error {
case decodingError
}
let json1 = """
{"name":"park"}
"""
let json2 = """
{"my_name":"Kim"}
"""
func decode(json: String) -> Single<SomeJSON> {
Single<SomeJSON>.create { observer -> Disposable in
guard let data = json.data(using: .utf8),
let json = try? JSONDecoder().decode(SomeJSON.self,from: data)
else {
observer(.failure(JSONError.decodingError))
return Disposables.create()
}
observer(.success(json))
return Disposables.create()
}
}
decode(json: json2)
.subscribe{
switch $0 {
case .success(let json):
print(json.name)
case .failure(let error):
print(error)
}
}.disposed(by: disposeBag)
Observable이자 Observer
→ 빈 상태로 시작하여 새로운 값만을 subscriber에 방출한다.
가장 상단이 PublishSubject.
첫번째 구독자는 1 이후에 subscribe 했으므로 2부터 받을 수 있다.
두번째 구독자는 2 이후에 subscribe 했으므로 3부터 받을 수 있다.
→ 하나의 초기값을 가진 상태로 시작하여, 새로운 subscriber에게 초기값 또는 최신값을 방출한다.
가장 상단이 BehaviorSubject.
첫번째 구독자는 1 이후에 subscribe 했으므로 직전인 1부터 받을 수 있다.
두번째 구독자는 2 이후에 subscribe 했으므로 직전인 2부터 받을 수 있다.
→ 버퍼를 두고 초기화하며, 버퍼 사이즈만큼의 값들을 유지하면서 새로운 subscriber에게 방출한다.
가장 상단이 RelaySubject.
버퍼사이즈가 2라고 했을 때, 두번째 구독자는 1과 2를 모두 받을 수 있다.