Combine
PassthroughSubject์ ๋ํด์ ์ค๋ช
ํ์์ค
PassthroughSubject๋ Combine ํ๋ ์์ํฌ์์ ์ ๊ณตํ๋ ํด๋์ค๋ก, ์ธ๋ถ์์ ๊ฐ์ ์ง์ ๋ฐํํ ์ ์๋๋ก ํ๋ Publisher์
๋๋ค. ์ด Subject๋ ์๋ฌด ๊ฐ์ด๋ ๋ฐํํ์ง ์๊ณ , ์ธ๋ถ๋ก๋ถํฐ ๋ช
์์ ์ผ๋ก ๋ฐํ๋ ๊ฐ์ ์ ๋ฌํฉ๋๋ค. ์ฃผ๋ก ํ๋ก๊ทธ๋๋จธ๊ฐ ์ง์ ์ด๋ฒคํธ๋ฅผ ๋ฐํํด์ผ ํ๋ ๊ฒฝ์ฐ์ ์ฌ์ฉ๋ฉ๋๋ค.
์๋ฅผ ๋ค์ด, ๋ฒํผ ํด๋ฆญ ์ด๋ฒคํธ๋ฅผ ์คํธ๋ฆผ์ผ๋ก ์ฒ๋ฆฌํ๊ฑฐ๋, ์ฌ์ฉ์๊ฐ ์ง์ ๋ฐํํด์ผ ํ๋ ์ปค์คํ ์ด๋ฒคํธ์ ์ฌ์ฉ๋ ์ ์์ต๋๋ค.
import Combine
let subject = PassthroughSubject<String, Never>()
subject.sink { value in
print("Received value: \(value)")
}
subject.send("Hello, World!")@Published์ ๋ํด์ ์ค๋ช
ํ์์ค
@Published๋ SwiftUI์ Combine ํ๋ ์์ํฌ์์ ์ฌ์ฉ๋๋ ์์ฑ ๋ํผ(Property Wrapper)๋ก, ๊ฐ์ด ๋ณ๊ฒฝ๋ ๋๋ง๋ค ์๋์ผ๋ก ์ด๋ฒคํธ๋ฅผ ๋ฐํํ๋ Publisher๋ฅผ ์์ฑํฉ๋๋ค. ์ฃผ๋ก SwiftUI์ ์ํ ๊ด๋ฆฌ๋ฅผ ์ํด ์ฌ์ฉ๋๋ฉฐ, ๋ทฐ๊ฐ ๋ชจ๋ธ์ ์ํ ๋ณํ๋ฅผ ๊ฐ์งํ๊ณ ์ด์ ๋ฐ๋ผ ์
๋ฐ์ดํธ๋ ์ ์๋๋ก ํฉ๋๋ค.
import Combine
import SwiftUI
class ViewModel: ObservableObject {
@Published var text: String = "Hello"
}
struct ContentView: View {
@ObservedObject var viewModel = ViewModel()
var body: some View {
Text(viewModel.text)
}
}AnyCancellable์ ๋ํด์ ์ค๋ช
ํ์์ค
AnyCancellable์ Combine ํ๋ ์์ํฌ์์ ์ ๊ณตํ๋ ํ์
์ผ๋ก, Publisher์ ๊ตฌ๋
์ ๊ด๋ฆฌํ๊ณ , ๊ตฌ๋
์ ์ทจ์ํ ์ ์๋ ํธ๋ค์ ์ ๊ณตํฉ๋๋ค. ์ฃผ๋ก ๊ตฌ๋
์ ์๋์ผ๋ก ์ทจ์ํ๊ฑฐ๋, ๊ตฌ๋
์ด ํ์ ์์ ๋ ์๋์ผ๋ก ์ทจ์๋๋๋ก ํ ๋ ์ฌ์ฉ๋ฉ๋๋ค. AnyCancellable์ ๊ตฌ๋
์ ์ทจ์ํ๊ธฐ ์ํด ํธ์ถํ cancel() ๋ฉ์๋๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค.
sink์ ๋ํด์ ์ค๋ช
ํ์์ค
sink๋ Combine ํ๋ ์์ํฌ์์ Publisher์ ์ด๋ฒคํธ๋ฅผ ๊ตฌ๋
ํ๊ณ , ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ๋ ํด๋ก์ ๋ฅผ ์ ๊ณตํ๋ ๋ฉ์๋์
๋๋ค. sink๋ Publisher๊ฐ ๋ฐํํ๋ ๊ฐ์ ๋ฐ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์ ์ํ ์ ์๋๋ก ํฉ๋๋ค. ์ด๋ฅผ ํตํด Publisher์ ๊ฐ์ด ๋ณ๊ฒฝ๋ ๋๋ง๋ค ํน์ ๋์์ ์ํํ ์ ์์ต๋๋ค.
throttle๊ณผ debounce์ ์ฐจ์ด์ ์ ์ค๋ช
ํ์์ค
throttle๊ณผ debounce๋ ์ด๋ฒคํธ ์คํธ๋ฆผ์ ์ ์ดํ๋ ๋ฐ ์ฌ์ฉ๋๋ ์ฐ์ฐ์๋ก, ์ด๋ฒคํธ ๋ฐ์ ๋น๋๋ฅผ ์กฐ์ ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
throttle: ์ฃผ์ด์ง ์๊ฐ ๊ฐ๊ฒฉ ๋์ ๋ฐ์ํ ์ฒซ ๋ฒ์งธ ์ด๋ฒคํธ๋ง ๋ฐํํฉ๋๋ค. ์ด ์ฐ์ฐ์๋ ์ฃผ๊ธฐ์ ์ผ๋ก ์ด๋ฒคํธ๋ฅผ ๋ฐฉ์ถํ์ฌ ์ด๋ฒคํธ ๋ฐ์ ๋น๋๋ฅผ ์ ์ดํฉ๋๋ค. ์ง์ ๋ ๊ฐ๊ฒฉ ๋์ ๋ค๋ฅธ ์ด๋ฒคํธ๊ฐ ๋ฌด์๋ฉ๋๋ค.
debounce: ์ฃผ์ด์ง ์๊ฐ ๊ฐ๊ฒฉ ๋์ ๋ฐ์ํ ๋ง์ง๋ง ์ด๋ฒคํธ๋ฅผ ๋ฐํํฉ๋๋ค. ์ด ์ฐ์ฐ์๋ ์ง์ ๋ ๊ฐ๊ฒฉ ๋์ ์ด๋ฒคํธ๊ฐ ๋ ์ด์ ๋ฐ์ํ์ง ์์ ๋๊น์ง ๋๊ธฐํ ํ ๋ง์ง๋ง ์ด๋ฒคํธ๋ฅผ ๋ฐฉ์ถํฉ๋๋ค.
Data๋ฅผ Binding ํ๋ ๋ฐฉ๋ฒ์ ๋ํด์ ์ค๋ช
ํ์์ค
SwiftUI์์ Binding์ ๋ ๊ฐ์ ๋ทฐ ๊ฐ์ ๋ฐ์ดํฐ์ ์ํ๋ฅผ ๋๊ธฐํํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. @State, @ObservedObject, @EnvironmentObject ๋ฑ์ ์ฌ์ฉํ์ฌ ์ํ๋ฅผ ๊ด๋ฆฌํ ๋, Binding์ ์ฌ์ฉํ๋ฉด ๋ถ๋ชจ ๋ทฐ์ ์ํ๋ฅผ ์์ ๋ทฐ์ ์ ๋ฌํ์ฌ ์๋ฐฉํฅ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ์ ๊ตฌํํ ์ ์์ต๋๋ค.
์ฌ๊ธฐ์ TextField๋ $text ๋ฐ์ธ๋ฉ์ ์ฌ์ฉํ์ฌ text ์ํ ๋ณ์๋ฅผ ์
๋ฐ์ดํธํฉ๋๋ค.
Combine์์ Just์ Future์ ์ฐจ์ด์ ์ ๋ฌด์์ธ๊ฐ์?
Just:
Just๋ ๋จ์ผ ๊ฐ์ ์ฆ์ ๋ฐํํ๋ Publisher์ ๋๋ค. ์ฑ๊ณต์ ์ผ๋ก ํ ๋ฒ์ ๊ฐ๋ง ๋ฐํํ๊ณ ์๋ฃ(completion)๋ฉ๋๋ค. ์ฃผ๋ก ํ ์คํธ๋ ๊ฐ๋จํ ๊ฐ ๋ฐํ์ ์ฌ์ฉ๋ฉ๋๋ค.Future:
Future๋ ๋น๋๊ธฐ ์์ ์ ๊ฒฐ๊ณผ๋ฅผ ๋์ค์ ๋ฐํํ๋ Publisher์ ๋๋ค. ๋น๋๊ธฐ ์์ ์ ์ฑ๊ณต ๋๋ ์คํจ ๊ฒฐ๊ณผ๋ฅผ ํ ๋ฒ ๋ฐํํฉ๋๋ค. ์ฃผ๋ก ๋คํธ์ํฌ ์์ฒญ์ด๋ ๋ค๋ฅธ ๋น๋๊ธฐ ์์ ์ ์ฌ์ฉ๋ฉ๋๋ค.
Combine์ flatMap ์ฐ์ฐ์๋ ์ธ์ ์ฌ์ฉํ๋์?
flatMap ์ฐ์ฐ์๋ ์ฌ๋ฌ Publisher๋ฅผ ํ๋์ ์คํธ๋ฆผ์ผ๋ก ํฉ์น๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ๊ฐ ์
๋ ฅ ๊ฐ์ ๋ํด ์๋ก์ด Publisher๋ฅผ ์์ฑํ๊ณ , ์ด Publisher๋ค์ด ๋ฐํํ๋ ๋ชจ๋ ๊ฐ๋ค์ ๋จ์ผ ์คํธ๋ฆผ์ผ๋ก ๋ณํฉํฉ๋๋ค. ์ฃผ๋ก ๋น๋๊ธฐ ์์
์ด ์ค์ฒฉ๋๋ ์ํฉ์์ ์ฌ์ฉ๋ฉ๋๋ค.
Combine์์ merge์ combineLatest์ ์ฐจ์ด์ ์ ๋ฌด์์ธ๊ฐ์?
merge:
merge์ฐ์ฐ์๋ ์ฌ๋ฌ Publisher๋ฅผ ๋ณํฉํ์ฌ ํ๋์ ์คํธ๋ฆผ์ผ๋ก ๋ง๋ญ๋๋ค. ๊ฐ Publisher๊ฐ ๋ฐํํ๋ ์ด๋ฒคํธ๋ฅผ ์๊ฐ ์์๋๋ก ๋ฐฉ์ถํฉ๋๋ค.combineLatest:
combineLatest์ฐ์ฐ์๋ ์ฌ๋ฌ Publisher์ ์ต์ ๊ฐ์ ๊ฒฐํฉํ์ฌ ํ๋์ ์คํธ๋ฆผ์ผ๋ก ๋ง๋ญ๋๋ค. ๋ชจ๋ Publisher๊ฐ ์ ์ด๋ ํ ๋ฒ ๊ฐ์ ๋ฐํํด์ผ ๊ฒฐํฉ๋ ๊ฐ์ ๋ฐฉ์ถํฉ๋๋ค.
@ObservedObject์ @StateObject์ ์ฐจ์ด์ ์ ๋ฌด์์ธ๊ฐ์?
@ObservedObject:
@ObservedObject๋ ๋ค๋ฅธ ๊ณณ์์ ์์ ํ๋ ๊ฐ์ฒด๋ฅผ ๊ด์ฐฐํ๊ธฐ ์ํด ์ฌ์ฉ๋ฉ๋๋ค. ์ด ๊ฐ์ฒด์ ์ํ๊ฐ ๋ณ๊ฒฝ๋๋ฉด ํด๋น ๋ทฐ๊ฐ ์ ๋ฐ์ดํธ๋ฉ๋๋ค. ๊ฐ์ฒด์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ด๋ฆฌํ์ง ์๊ธฐ ๋๋ฌธ์ ๋ถ๋ชจ ๋ทฐ๊ฐ ๊ฐ์ฒด๋ฅผ ์์ ํฉ๋๋ค.@StateObject:
@StateObject๋ ๋ทฐ ๋ด๋ถ์์ ๊ฐ์ฒด๋ฅผ ์์ ํ๊ณ ๊ด๋ฆฌํ๊ธฐ ์ํด ์ฌ์ฉ๋ฉ๋๋ค. ์ด ๊ฐ์ฒด์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๋ทฐ๊ฐ ์ฑ ์์ง๋ฉฐ, ๋ทฐ๊ฐ ์ด๊ธฐํ๋ ๋ ํ ๋ฒ๋ง ์ด๊ธฐํ๋ฉ๋๋ค.
Combine์ catch ์ฐ์ฐ์๋ ์ด๋ป๊ฒ ์ฌ์ฉ๋๋์?
catch ์ฐ์ฐ์๋ ์๋ฌ๊ฐ ๋ฐ์ํ์ ๋ ๋์ฒด Publisher๋ฅผ ์ ๊ณตํ์ฌ ์คํธ๋ฆผ์ ๋ณต๊ตฌํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์๋ฌ๊ฐ ๋ฐ์ํ๋ฉด ๋์ฒด Publisher๊ฐ ๊ฐ์ ๋ฐํํ์ฌ ์คํธ๋ฆผ์ด ๋๊ธฐ์ง ์๋๋ก ํฉ๋๋ค.
SwiftUI์์ @EnvironmentObject๋ ๋ฌด์์ด๊ณ , ์ธ์ ์ฌ์ฉํ๋์?
@EnvironmentObject๋ ๋ทฐ ๊ณ์ธต ๊ตฌ์กฐ ์ ์ฒด์ ๊ฑธ์ณ ๊ณต์ ๋๋ ๊ฐ์ฒด๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํด ์ฌ์ฉ๋ฉ๋๋ค. ์ฃผ๋ก ์ฑ์ ์ ์ญ ์ํ๋ฅผ ๊ด๋ฆฌํ๊ฑฐ๋ ์ฌ๋ฌ ๋ทฐ ๊ฐ์ ๊ณต์ ํด์ผ ํ๋ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ ๋ ์ฌ์ฉ๋ฉ๋๋ค.
Combine์์ Publisher์ Subscriber์ ๊ด๊ณ๋ฅผ ์ค๋ช
ํ์ธ์.
Publisher:
Publisher๋ ๋ฐ์ดํฐ๋ฅผ ์์ฑํ๊ณ ๋ฐํํ๋ ๊ฐ์ฒด์ ๋๋ค.Publisher๋ ์ฌ๋ฌ ์ด๋ฒคํธ(๊ฐ ๋๋ ์๋ฃ/์คํจ ์ด๋ฒคํธ)๋ฅผ ๋ฐํํ ์ ์์ต๋๋ค.Publisher๋subscribe๋ฉ์๋๋ฅผ ํตํดSubscriber์ ์ฐ๊ฒฐ๋ฉ๋๋ค.Subscriber:
Subscriber๋Publisher๊ฐ ๋ฐํํ๋ ๋ฐ์ดํฐ๋ฅผ ์์ ํ๋ ๊ฐ์ฒด์ ๋๋ค.Subscriber๋receive(subscription:),receive(_:),receive(completion:)๋ฉ์๋๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค.
๋ ๊ฐ์ฒด๋ subscribe ๋ฉ์๋๋ฅผ ํตํด ์ฐ๊ฒฐ๋๋ฉฐ, Publisher๊ฐ ๋ฐ์ดํฐ๋ฅผ ๋ฐํํ๋ฉด Subscriber๊ฐ ์ด๋ฅผ ์์ ํ์ฌ ์ฒ๋ฆฌํฉ๋๋ค.
Combine์ switchToLatest ์ฐ์ฐ์๋ ์ด๋ป๊ฒ ์๋ํ๋์?
switchToLatest ์ฐ์ฐ์๋ ์ฌ๋ฌ Publisher๊ฐ ๋ฐํํ๋ ๊ฐ ์ค ๊ฐ์ฅ ์ต๊ทผ์ ๋ฐํ๋ Publisher์ ๊ฐ์ ๊ตฌ๋
ํ์ฌ ๋ฐฉ์ถํฉ๋๋ค. ์ฃผ๋ก ์ต์ ๋ฐ์ดํฐ๋ง ํ์ํ ๋ ์ฌ์ฉ๋ฉ๋๋ค.
Combine์ assign ์ฐ์ฐ์๋ ์ด๋ค ์ญํ ์ ํ๋์?
assign ์ฐ์ฐ์๋ Publisher๊ฐ ๋ฐํํ๋ ๊ฐ์ ํน์ ๊ฐ์ฒด์ ์์ฑ์ ํ ๋นํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ฃผ๋ก ๋ทฐ ๋ชจ๋ธ์ ์์ฑ์ ์
๋ฐ์ดํธํ๊ฑฐ๋ ์ํ๋ฅผ ๊ด๋ฆฌํ ๋ ์ฌ์ฉ๋ฉ๋๋ค.
Combine์์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ์ด๋ป๊ฒ ํ๋์? (์: AnyCancellable๊ณผ store ๋ฉ์๋)
Combine์์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ ์ฃผ๋ก AnyCancellable๊ณผ store ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌ๋
์ ๊ด๋ฆฌํฉ๋๋ค. ๊ตฌ๋
์ ์ทจ์ํ์ง ์์ผ๋ฉด ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ๋ฐ์ํ ์ ์์ผ๋ฏ๋ก, ์ ์ ํ ์์ ์ ๊ตฌ๋
์ ์ทจ์ํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
AnyCancellable:
AnyCancellable์ ๊ตฌ๋ ์ ์ทจ์ํ ์ ์๋ ๊ฐ์ฒด๋ก, ๊ตฌ๋ ์ ๋ช ์์ ์ผ๋ก ์ทจ์ํ๊ฑฐ๋, ๊ฐ์ฒด๊ฐ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋ ๋ ์๋์ผ๋ก ์ทจ์๋ฉ๋๋ค.store:
store๋ฉ์๋๋ ์ฌ๋ฌAnyCancellable์ ๊ด๋ฆฌํ๊ธฐ ์ํดSet<AnyCancellable>์ ๊ตฌ๋ ์ ์ ์ฅํฉ๋๋ค. ๋ทฐ ๋๋ ๋ทฐ ๋ชจ๋ธ์ ์๋ช ์ฃผ๊ธฐ์ ํจ๊ป ๊ตฌ๋ ์ ๊ด๋ฆฌํ ๋ ์ ์ฉํฉ๋๋ค.
์ด๋ ๊ฒ ํ๋ฉด ViewModel์ด ํด์ ๋ ๋ ๋ชจ๋ ๊ตฌ๋
์ด ์๋์ผ๋ก ์ทจ์๋ฉ๋๋ค
Last updated