WonderPark 2023. 6. 10. 02:23

 

์ง€๋‚œ ์‹œ๊ฐ„์— ์ด์–ด ๋‘๋ฒˆ์งธ๋กœ ๋Œ์•„์˜จ Combine ์„ธ๋ฏธ๋‚˜ 2ํƒ„์ž…๋‹ˆ๋‹ค.

์ด๋ฒˆ ์‹œ๊ฐ„์—๋Š” Subject ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐ ํ•ด๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค!! ๋‘๋‘ฅ ๐Ÿคฉ

 

Subject?

https://developer.apple.com/documentation/combine/subject

 

Subject | Apple Developer Documentation

A publisher that exposes a method for outside callers to publish elements.

developer.apple.com

 

 

 

Subject ๋Š” ๋ฌด์—‡?

๋ณด์•„ํ•˜๋‹ˆ Publisher ํ”„๋กœํ† ์ฝœ์„ ๋”ฐ๋ฅด๊ณ ์žˆ๊ณ , Publisher ๋ผ๋Š”๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์ฃ  ,,

๊ทธ๋Ÿผ ๊ทธ๋™์•ˆ ์šฐ๋ฆฌ๊ฐ€ ์•Œ๊ณ  ์žˆ๋˜ Publisher์™€๋Š” ์–ด๋–ค ์ฐจ์ด์ ์ด ์žˆ์„๊นŒ์š”?

 

⇒ ๋ฐ”๋กœ send(_:) ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•ด์„œ ๋ฐ–์—์„œ!! ์ด๋ฒคํŠธ ๊ฐ’์„ ์ฃผ์ž…์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ํผ๋ธ”๋ฆฌ์…”์ž…๋‹ˆ๋‹ค.

 

๋ญ” ์†Œ๋ฆฐ์ง€ ์•„์ง ๋ชจ๋ฅด๊ฒ ์ฃ ? ใ…Žใ…Ž ์ผ๋‹จ ๋ด…์‹œ๋‹ค

 

Subject๋Š” 2๊ฐ€์ง€ ๋นŒํŠธ์ธ ํƒ€์ž…์ด ์žˆ๋Š”๋ฐ์š”, ๋‘๊ฐ€์ง€ Subject์˜ ์ฐจ์ด๋ฅผ ์‰ฝ๊ฒŒ ์„ค๋ช…ํ•ด๋ณผ๊ฒŒ์š”

๋งŒ์•ฝ send ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด 1→ 2→ 3 ์ด๋ผ๋Š” ๊ฐ’๋“ค์„ ์ˆœ์„œ๋Œ€๋กœ ์ฃผ์ž…์‹œ์ผฐ์„๋•Œ

1. PassthroughSubject: Subscriber๊ฐ€ ๊ฐ’์„ ์š”์ฒญํ•˜๋ฉด, ๋‚ด๊ฐ€ ๋ฐฉ๊ธˆ ๋ฐ›์€ ๊ฐ’ 3์„ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค

2. CurrentValueSubject: Subscriber๊ฐ€ ๊ฐ’์„ ์š”์ฒญํ•˜๋ฉด, ์ตœ๊ทผ์— ๊ฐ–๊ณ  ์žˆ๋˜ ๊ฐ’ 1, 2 ๋ฅผ ์ „๋‹ฌํ•˜๊ณ ~ ๋ฐฉ๊ธˆ ๋ฐ›์€ ๊ฐ’ 3 ์„ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

 

์˜ˆ์ œ ํ•œ๋ฒˆ ๋ณผ๊ฒŒ์š”!

// PassthroughSubject
let relay = PassthroughSubject<String, Never>()
let subscription1 = relay.sink { value in
    print("subscription1 received value: \(value)")
}

relay.send("Hello")
relay.send("World!")



// CurrentValueSubject
let variable = CurrentValueSubject<String, Never>("")

variable.send("Initial text")

let subscription2 = variable.sink { value in
    print("subscription2 received value: \(value)")
}

variable.send("More text")
variable.value

 

 

๋จผ์ € ์‚ดํŽด๋ณผ ๊ฒƒ์€

send๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด์„œ ์™ธ๋ถ€์—์„œ Subject ์— ๊ฐ’์„ ์ฃผ์ž…์‹œํ‚ค๊ณ  ์žˆ๋Š”๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์ฃ !

 

๊ฒฐ๊ณผ ๊ฐ’์„ ๋ณด๋ฉด, PassthroughSubject ๊ฐ™์€ ๊ฒฝ์šฐ์—

send ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ "Hello" , "World!" ๋‘๊ฐ€์ง€ ๋‹จ์–ด๋ฅผ

์™ธ๋ถ€์—์„œ PassthroughSubject (publisher) ์— ๊ฐ’์„ ์ฃผ์ž…์‹œ์ผœ ์ฃผ์—ˆ์ฃ .

๊ทธ๋žฌ์„๋•Œ ๊ฐ€์žฅ ์ตœ๊ทผ์˜ ๊ฐ’๋งŒ ์ˆœ์„œ๋Œ€๋กœ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๋ฐ˜๋ฉด์— CurrentValueSubject ๋ฅผ ๋ณด๋ฉด

sink ๋กœ ๊ตฌ๋…ํ•˜๊ธฐ ์ „์— variable (CurrentValueSubject) ์— "Initial text" ๋ผ๋Š” ๊ฐ’์„ ๋จผ์ € ์ฃผ์ž…์‹œํ‚ค๊ณ 

sink ๋กœ ๊ตฌ๋…ํ•œ ํ›„์— "More text" ๋ฅผ ์ฃผ์ž…์‹œ์ผœ ์ฃผ์—ˆ๋”๋‹ˆ

๋จผ์ € ๋“ค์–ด์™”๋˜ ๊ฐ’์ธ Initial text๊ฐ€ ๋จผ์ € ์ถœ๋ ฅ๋˜๊ณ  ๊ทธ ๋‹ค์Œ์— More text ๊ฐ€ ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ด์ œ ์ฐจ์ด๋ฅผ ์•„์‹œ๊ฒ ๋‚˜์š”?? ๐Ÿ˜†

 

 

 

์—ฌ๊ธฐ๊นŒ์ง€ Subject์˜ ๊ฐœ๋…๊ณผ Subject ์˜ ๋นŒํŠธ์ธ ํƒ€์ž…์ธ PassthroughSubject ์™€ CurrentValueSubject ์˜ ์ฐจ์ด์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์•˜์Šต๋‹ˆ๋‹ค!

 

๋‹ค์Œ ์‹œ๊ฐ„์—๋Š” Combine ์˜ 3๋Œ€์žฅ(Publisher, Subscriber, Operator) ์ค‘ ํ•˜๋‚˜์ธ Operator ์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ๊ฒŒ์š”

 

 

๊ทธ๋Ÿผ ์•ˆ๋‡จ์˜ค์˜ค์˜น~~~ ๐Ÿ˜‹๐ŸŽ