์ ๋ค๋ฆญ ๊ตฌ์กฐ์ฒด | ๋ฐํํ๋ ๋ชจ๋ ์ด๋ฒคํธ์ ๋ํ์ฌ, ์ ํ์ ์ผ๋ก ์ ๋์ฌ๋ฅผ ๋ถ์ผ ์ ์๋ ๋ก๊ทธ ๋ฉ์ธ์ง๋ฅผ ์ถ๋ ฅํ๋ Publisher
์ด๋์
๋ผ์ด์ ๋ ์ธ ๊ฐ์ ์ธ์๋ฅผ ๋ฐ๋๋ค.
upstream
: ์์์ ํ๋ฅด๋ Publisher
prefix
: ๋ก๊ทธ ๋ฉ์ธ์ง์ ์์ ๋ถ์ผ ๋ฌธ์์ด
to
: ํ
์คํธ๋ฅผ ์ถ๋ ฅํ ๊ณณ. nil์ด๋ฉด ํ์ค ์ถ๋ ฅ์ผ๋ก ์ถ๋ ฅํ๋ค.
์ด๋ฒคํธ์ ๋ํ์ฌ ๋ก๊ทธ ๋ฉ์ธ์ง๋ฅผ ์ถ๋ ฅํ๋ค.
๋ค์์ ์ด๋ฒคํธ๋ฅผ ์ ๋ฌ๋ฐ์ผ๋ฉด ๋ก๊ทธ ๋ฉ์ธ์ง๋ฅผ ์ถ๋ ฅํ๋ค.
์ ์ ์ข
๋ฃNormal Completion
๋งค ์คํผ๋ ์ดํฐ ์คํ ํ Publisher์ ์ํ๋ฅผ ํ์ธํ๋ ๋ฑ ๋๋ฒ๊น
๊ณผ์ ์์ ์ ์ฉํ๊ฒ ์ฌ์ฉํ ์ ์๋ค.
print
์คํผ๋ ์ดํฐ์ ๊ด๋ จ์ด ์๋ค.
// Publishers.Print Publisher
Publishers
.Print(upstream: Just(Void()), prefix: "")
.sink(receiveCompletion: { completion in
switch completion {
case .failure:
print("Combine Print Error")
case .finished:
print("Combine Print Finish")
}
}, receiveValue: {
print("Combine Print")
})
.store(in: &cancellables)
// print Operator
Just(Void())
.print()
.sink(receiveCompletion: { completion in
switch completion {
case .failure:
print("Combine Print Error")
case .finished:
print("Combine Print Finish")
}
}, receiveValue: {
print("Combine Print")
})
.store(in: &cancellables)
// receive subscription: (Just)
// request unlimited
// receive value: (())
// Combine Print
// receive finished
// Combine Print Finish
prefix
์ ์คํ ์๊ฐ / ํ์ผ, ๋ผ์ธ, ํจ์ ์ด๋ฆ ์ ๋ณด ๋ฑ์ ๋ด์ผ๋ฉด ๋์ฑ ๋๋ฒ๊น
ํ๊ธฐ ์ข์ ๊ฒ์ด๋ค.
RxSwift
debug
์คํผ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌํํ ์ ์๋ค.
Observable.just(Void())
.debug()
.subscribe(onNext: {
print("RxSwift Print")
}, onError: { _ in
print("RxSwift Print Error")
}, onCompleted: {
print("RxSwift Print Finish")
})
.disposed(by: disposeBag)
// 2019-10-29 22:11:20.753: ContentViewModel.swift:57 (rxSwift()) -> subscribed
// 2019-10-29 22:11:20.755: ContentViewModel.swift:57 (rxSwift()) -> Event next(())
// RxSwift Print
// 2019-10-29 22:11:20.755: ContentViewModel.swift:57 (rxSwift()) -> Event completed
// RxSwift Print Finish
// 2019-10-29 22:11:20.755: ContentViewModel.swift:57 (rxSwift()) -> isDisposed
ReactiveSwift
logEvents
์คํผ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌํํ ์ ์๋ค.
SignalProducer(value: Void())
.logEvents()
.start { event in
switch event {
case .value:
print("ReactiveSwift Print")
case .failed:
print("ReactiveSwift Print Error")
case .completed:
print("ReactiveSwift Print Finish")
default:
break
}
}
// [] starting fileName: /Users/presto/Developer/Xcode/ReactivePractice/ReactivePractice/ContentViewModel.swift, functionName: reactiveSwift(), lineNumber: 71
// [] value fileName: /Users/presto/Developer/Xcode/ReactivePractice/ReactivePractice/ContentViewModel.swift, functionName: reactiveSwift(), lineNumber: 71
// ReactiveSwift Print
// [] completed fileName: /Users/presto/Developer/Xcode/ReactivePractice/ReactivePractice/ContentViewModel.swift, functionName: reactiveSwift(), lineNumber: 71
// [] terminated fileName: /Users/presto/Developer/Xcode/ReactivePractice/ReactivePractice/ContentViewModel.swift, functionName: reactiveSwift(), lineNumber: 71
// ReactiveSwift Print Finish
// [] disposed fileName: /Users/presto/Developer/Xcode/ReactivePractice/ReactivePractice/ContentViewModel.swift, functionName: reactiveSwift(), lineNumber: 71
// [] started fileName: /Users/presto/Developer/Xcode/ReactivePractice/ReactivePractice/ContentViewModel.swift, functionName: reactiveSwift(), lineNumber: 71