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