๊ธ€ ์ž‘์„ฑ์ž: ๊ฐœ๋ฐœํ•˜๋Š” ํ›ˆ์ด

Combine in Practice 

์ง€๋‚œ ํฌ์ŠคํŠธ์— ์ด์–ด์„œ ์„ธ์…˜์˜ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์ธ Subscriber ์ฃผ์ œ์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค! ์˜ค์—ญ์ด๋‚˜ ์˜์—ญ์ด ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋‹ˆ ๋” ์ž์„ธํ•˜๊ณ  ๋ช…ํ™•ํ•œ ๋‚ด์šฉ์€ ์•„๋ž˜ ์„ธ์…˜์—์„œ ํ™•์ธํ•ด๋ณด์„ธ์š”!

 

Combine in Practice - WWDC19 - Videos - Apple Developer

Expand your knowledge of Combine, Apple's new unified, declarative framework for processing values over time. Learn about how to...

developer.apple.com

Subscriber 

Publisher์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ Subscriber ์—ญ์‹œ ๋‘ ๊ฐœ์˜ Associated Type๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค. Input๊ณผ Failure ์ด์ฃ . ๊ทธ๋ฆฌ๊ณ  ์„ธ ๊ฐœ์˜ ์ด๋ฒคํŠธ ํ•จ์ˆ˜๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜๋“ค์ด ๋ถˆ๋ฆฌ๋Š” ์ˆœ์„œ๋Š” ๋‹ค์Œ ๊ทœ์น™์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.

์ฒซ๋ฒˆ์งธ ๊ทœ์น™์€ Publisher๊ณผ ๊ตฌ๋…์ž๋ฅผ ๋“ฑ๋กํ•˜๋Š” ํ–‰๋™์— ๋ฐ˜์‘ํ•ด์„œ ๋”ฑ ํ•œ ๋ฒˆ receive(subscription:) ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

๋‘๋ฒˆ์งธ ๊ทœ์น™์ž…๋‹ˆ๋‹ค. Publisher๋Š” 0๊ฐœ ์ด์ƒ์˜ ๊ฐ’์„Subscriber๊ฐ€ ์š”์ฒญํ–ˆ์„ ๋•Œ downstream์„ ํ†ตํ•ด ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ Publisher๋Š” ์ตœ์†Œํ•œ ํ•˜๋‚˜์˜ ์™„๋ฃŒ์‹ ํ˜ธ๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋•Œ Publisher๋Š” ์ž์‹ ์ด ์™„๋ฃŒ๋˜์—ˆ๊ฑฐ๋‚˜, ์‹คํŒจํ–ˆ์Œ์„ ์•Œ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์‹œ ์ •๋ฆฌํ•ด๋ด…์‹œ๋‹ค. Subscriber๋Š” ํ•˜๋‚˜์˜ subscription์„ ๋ฐ›๊ณ , 0๊ฐœ ์ด์ƒ์˜ ๊ฐ’์„ ์ „๋‹ฌ๋ฐ›์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ตœ์†Œํ•œ ํ•˜๋‚˜์˜ ์™„๋ฃŒ, ํ˜น์€ ์‹คํŒจ ์‹ ํ˜ธ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์™„๋ฃŒ์‹ ํ˜ธ๋Š” ์˜ต์…”๋„์ด๊ธฐ ๋•Œ๋ฌธ์—, ๋งŽ์€ stream์€ NotificationCenter์ฒ˜๋Ÿผ ์ข…๋ฃŒ๋˜์ง€ ์•Š๊ณ  ๊ณ„์† ๋™์ž‘ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ปด๋ฐ”์ธ์—์„œ๋Š” ๋‹ค์–‘ํ•œ ์ข…๋ฅ˜์˜ Subscriber๋“ค์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์ด๋“ค์ด ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ์‚ดํŽด๋ด…์‹œ๋‹ค.

์ด์ „ ํฌ์ŠคํŠธ์—์„œ ๋งŒ๋“ค์—ˆ๋˜ ์ด Publisher ์˜ˆ์ œ๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

Key Path Assignment

๋จผ์ € ์ปด๋ฐ”์ธ์—์„œ ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ Subscriber์ธ Key Path Assignment๋ฅผ ๋ด…์‹œ๋‹ค. Key Path Assignment๋Š” assign(to: on:) operator๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜๋Š” Publisher๊ฐ€ ๋ฐฉ์ถœํ•œ ๊ฐ’์ด ํŠน์ •ํ•œ Key Path์— ํ• ๋‹น๋œ ๊ฐ์ฒด์— ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. 

assign operator๋„ ์—ญ์‹œ cancellation ํ† ํฐ์„ ์ƒ์„ฑํ•ด์„œ subscription์„ ์ข…๋ฃŒํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

Cancellation

Cancellation์— ๋Œ€ํ•œ ์ด์•ผ๊ธฐ๋ฅผ ์กฐ๊ธˆ ๋” ํ•ด๋ด…์‹œ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ปด๋ฐ”์ธ ์•ˆ์— Cancellation์„ ํฌํ•จ์‹œ์ผฐ์Šต๋‹ˆ๋‹ค. Cancellation์€ Publisher๊ฐ€ ์ด๋ฒคํŠธ๋ฅผ ์ „๋‹ฌํ•˜๊ธฐ ์ „์— Subscription์„ ์ข…๋ฃŒํ•  ์ˆ˜ ์žˆ๋Š” ์ด์ ์„ ์ฃผ๊ธฐ ๋•Œ๋ฌธ์ด์ฃ . ์ด ํŠน์ง•์€ ํŠนํžˆ subscription๊ณผ ๊ด€๋ จ๋œ ๋ฆฌ์†Œ์Šค๋ฅผ ํ•ด์ œํ•  ๋•Œ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ €ํฌ๋Š” Cancel์— ๋Œ€ํ•œ ์ƒˆ๋กœ์šด ํ”„๋กœํ† ์ฝœ์„ ๋„์ž…ํ–ˆ๊ณ  ๊ต‰์žฅํžˆ ์šฉ์šฉํ•œ AnyCancellable์„ ์†Œ๊ฐœํ•ด๋“œ๋ฆฌ๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. AnyCancellable์€ deinit ๋‹จ๊ณ„์—์„œ ์ž๋™์œผ๋กœ cancel์„ ํ˜ธ์ถœํ•˜๋Š” ๊ฐ•๋ ฅํ•œ ํƒ€์ž…์ž…๋‹ˆ๋‹ค. ์ด์ œ Swift์—๊ฒŒ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋ฅผ ๋งก๊ธฐ๊ณ  ์—ฌ๋Ÿฌ๋ถ„๋“ค์ด ์ง์ ‘ cancel์„ ํ˜ธ์ถœํ•˜์ง€ ์•Š์•„๋„ ๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

Sink

์ด์ œ ๋‘๋ฒˆ์งธ Subscription ํƒ€์ž…์ธ sink ๋ฅผ ์•Œ์•„๋ด…์‹œ๋‹ค.

Sink๋Š” ์ง„์งœ ํ™˜์ƒ์ ์ด์—์š”! ์—ฌ๋Ÿฌ๋ถ„๋“ค์€ ๋‹จ์ง€ ์ „๋‹ฌ๋ฐ›๋Š” ๊ฐ’์— ๋Œ€ํ•œ ํด๋กœ์ €๋ฅผ ์ œ๊ณตํ•˜๋ฉด ์ƒˆ๋กœ์šด ๊ฐ’์ด ์ „๋‹ฌ๋  ๋•Œ๋งˆ๋‹ค ํ•ด๋‹น ํด๋กœ์ €๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, sink๋Š” cancellable์„ ๋ฐ˜ํ™˜ํ•ด์„œ ์ด๋ฅผ ์ด์šฉํ•ด subscription์„ ์ข…๋ฃŒ์‹œํ‚ฌ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

 

Subjects

์„ธ ๋ฒˆ์งธ ์œ ํ˜•์˜ subscription์€ ํ˜ผํ•ฉ๋œ ์œ ํ˜•์ž…๋‹ˆ๋‹ค. Publisher ๊ฐ™์œผ๋ฉด์„œ๋„, Subscriber ๊ฐ™์ฃ . Subjects๋Š” ๋ฉ€ํ‹ฐ์บ์ŠคํŒ…์„ ์ง€์›ํ•˜๊ณ  ๊ฐ’์„ ํ•„์ˆ˜์ ์œผ๋กœ ์ „์†กํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํŠน์ง•์€ ํŠนํžˆ ์ฝ”๋“œ ๋ฒ ์ด์Šค์˜ ์ž‘์—…์„ ํ•  ๋•Œ ์œ ๋ฆฌํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

 

๋จผ์ € Subjects๊ฐ€ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์•ž์„œ ์„ค๋ช…ํ–ˆ๋˜ ๊ฒƒ ์ฒ˜๋Ÿผ subject๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์—ฌ๋Ÿฌ๊ฐœ์˜ downstream์— ๋ธŒ๋กœ๋“œ์บ์ŠคํŒ…ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ฐ’์ด send๋ฅผ ํ†ตํ•ด ์ „์†ก๋˜์ง€ ์•Š๊ณ , upstream Publisher๊ฐ€ ๊ฐ’์„ ๋ฐฉ์ถœํ•˜๋Š” ๊ฒฝ์šฐ์—๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.

์ปด๋ฐ”์ธ์€ ๋‘ ๊ฐ€์ง€ ์ข…๋ฅ˜์˜ Subject๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๋จผ์ €, Passthrough๋Š” ๊ฐ’์„ ์ €์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ subscribe๋ฅผ ํ•˜์ง€ ์•Š์œผ๋ฉด ๊ฐ’์„ ํ™•์ธํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด์— CurrentValue๋Š” ๋งˆ์ง€๋ง‰์œผ๋กœ ๋ฐ›์•˜๋˜ ๊ฐ’์„ ๊ธฐ๋กํ•ด์„œ ์ƒˆ๋กœ์šด Subscriber๊ฐ€ ์—ฐ๊ฒฐ๋˜์–ด๋„ ๊ฐ’์„ ๊ณ„์† ์ถ”์ ํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ œ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๋ด…์‹œ๋‹ค. Publisher๋Š” ์ด์ „ ์˜ˆ์ œ์—์„œ ๋งŒ๋“ค์—ˆ๋˜ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. Subject๋Š” Output๊ณผ Failure Type์„ ์ง€์ •ํ•˜๊ณ  ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Subject๋Š” Subscriber์ฒ˜๋Ÿผ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. upstream Publisher๋ฅผ ๊ตฌ๋…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  sink์™€ ๊ฐ™์€ Operator๋ฅผ ํ†ตํ•ด Publisher์ฒ˜๋Ÿผ Subscriber๋ฅผ ๋“ฑ๋กํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿผ ์ด๋ ‡๊ฒŒ ๊ฐ’์„ ์ „์†กํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์‹ค์ œ๋กœ, Subject๋Š” ์ž์ฃผ ๋„์ฐฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ŠคํŠธ๋ฆผ์— subject๋ฅผ ์ฃผ์ž…ํ•  ์ˆ˜ ์žˆ๋Š” operator๋„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. share operator๋Š” Passthrough subject๋ฅผ ์ŠคํŠธ๋ฆผ์— ์ฃผ์ž…ํ•ฉ๋‹ˆ๋‹ค. Subject๋Š” ๊ต‰์žฅํžˆ ๊ฐ•๋ ฅํ•˜๊ณ  ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด์ œ ๋งˆ์ง€๋ง‰์œผ๋กœ SwiftUI์™€ ํ†ตํ•ฉ๋œ ๋„ค ๋ฒˆ์งธ ์œ ํ˜•์˜ Subject๋ฅผ ์†Œ๊ฐœํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

SwiftUI

SwiftUI์˜ ๋†€๋ผ์šด ์ ์€ ์—ฌ๋Ÿฌ๋ถ„์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์˜์กด์„ฑ์„ ์„ค๋ช…ํ•ด์ฃผ๋ฉด ๋‚˜๋จธ์ง€๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ๋ชจ๋‘ ๊ด€๋ฆฌํ•ด์ค€๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ปด๋ฐ”์ธ์˜ ๊ด€์ ์—์„œ ์ด ํŠน์ง•์€ ์—ฌ๋Ÿฌ๋ถ„์ด ๋ฐ์ดํ„ฐ๊ฐ€ ์–ธ์ œ, ์–ด๋–ป๊ฒŒ ๋ณ€๊ฒฝ๋˜๋Š”์ง€ ์ •์˜๋œ Publisher๋งŒ ์ œ๊ณตํ•ด์ฃผ๋ฉด ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. 

์ด๋ฅผ ์œ„ํ•ด์„œ ์—ฌ๋Ÿฌ๋ถ„์€ ๋‹จ์ˆœํ•˜๊ฒŒ ์ปค์Šคํ…€ ํƒ€์ž…์ด BindableObject ํ”„๋กœํ† ์ฝœ์„ ์ฑ„ํƒํ•˜๋„๋ก ํ•ด์ฃผ๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. 

SwfitUI์˜ BindableObject๋Š” ํ•˜๋‚˜์˜ associated type์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค. ๋ฐ”๋กœ Never๋ฅผ failure type์œผ๋กœ ๊ฐ€์ง€๋Š” publisher์ด์ฃ . ์ด๋Š” UI ํ”„๋ ˆ์ž„์›Œํฌ ์ž‘์—…๊ณผ ์ž˜ ์–ด์šธ๋ฆฝ๋‹ˆ๋‹ค. Publisher์— ๋„์ฐฉํ•˜๊ธฐ ์ „์— upstream error๋ฅผ ์ฒ˜๋ฆฌํ•˜๋„๋ก ๊ฐ•์ œํ•˜๊ธฐ ๋•Œ๋ฌธ์ด์ฃ . 

๋งˆ์ง€๋ง‰์œผ๋กœ didChange ํ”„๋กœํผํ‹ฐ๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. didChange๋Š” ์‹ค์ œ Publisher์—๊ฒŒ ํ•ด๋‹น ํ”„๋กœํ† ์ฝœ์„ ์ฑ„ํƒํ•œ ํƒ€์ž…์˜ ๊ฐ’์ด ๋ฐ”๋€Œ์—ˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๋ฆฝ๋‹ˆ๋‹ค.

 

๋” ์ž์„ธํ•œ ์ด์•ผ๊ธฐ๋“ค์€ SwiftUI Talk์—์„œ ๋‹ค๋ฃจ๊ณ , ์—ฌ๊ธฐ์„œ๋Š” ์‹ค์ œ๋กœ SwiftUI์—์„œ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

SwiftUI + BindableObject

WizardModel ํƒ€์ž…์— BindableOnbject๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  Subject๋ฅผ ์‚ฌ์šฉํ•ด ๊ฐ’์˜ ๋ณ€๊ฒฝ์„ ์ฒ˜๋ฆฌํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” Subject๋ฅผ ํ†ตํ•ด ํŠน์ •ํ•œ ์ข…๋ฅ˜์˜ ๊ฐ’์„ ์ „์†กํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. SwiftUI ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ๋‹จ๊ณ„์—์„œ ์–ด๋–ค ์ข…๋ฅ˜์˜ ๊ฐ’์„ ์ „์†กํ•ด์•ผํ•˜๋Š”์ง€ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๋Š” Void๋ฅผ Subject์˜ Output Type์œผ๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

์ด์ œ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๋•Œ๋ฅผ ์•Œ๊ธฐ ์œ„ํ•ด์„œ ํ”„๋กœํผํ‹ฐ ์˜ต์ €๋ฒ„๋ฅผ ํ”„๋กœํผํ‹ฐ์— ๋‹ฌ๊ณ  ๊ฐ’์ด ๋ณ€๊ฒฐ๋  ๋•Œ๋งˆ๋‹ค Subject์— ์ „์†ก์„ ๋ณด๋‚ด๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์ด์ œ ์ด๋ ‡๊ฒŒ ๋งŒ๋“ค์–ด์ง„ ๋ชจ๋ธ์„ ์œ„์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋ธ์„ ์„ ์–ธํ•˜๋ฉด์„œ ObjectBinding์œผ๋กœ ์ง€์ •ํ•˜๋ฉด,SwiftUI๋Š” ์ž๋™์œผ๋กœ Publisher๋ฅผ ๊ตฌ๋…ํ•  ์ˆ˜ ์žˆ๋„๋กํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์„ ์–ธ๋œ ๋ชจ๋ธ์„ body ํ”„๋กœํผํ‹ฐ์— ๋‘๋ฉด, SwiftUI๋Š” ๋ชจ๋ธ์˜ ๊ฐ’์— ๋ณ€๊ฒฝ์ด ์žˆ์„ ๋•Œ ์ƒˆ๋กญ๊ฒŒ body๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

 

Design for Composition

์ด์ œ๋ถ€ํ„ฐ๋Š” ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด์„œ ์ปด๋ฐ”์ธ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•ด๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

๋งˆ๋ฒ•ํ•™๊ต ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํšŒ์›๊ฐ€์ž… ํ™”๋ฉด์„ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค๊ณ  ํ•ด๋ด…์‹œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋•Œ ๋ช‡ ๊ฐ€์ง€ ์š”๊ตฌ์‚ฌํ•ญ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋จผ์ €, ์šฐ๋ฆฌ๋Š” ์‚ฌ์šฉ์ž์ด๋ฆ„์ด ์œ ํšจํ•œ์ง€ ์„œ๋ฒ„๋ฅผ ํ†ตํ•ด ํ™•์ธํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋น„๋ฐ€๋ฒˆํ˜ธ ํ•„๋“œ์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ ํ™•์ธ ํ•„๋“œ์˜ ๊ฐ’์ด ์ผ์น˜ํ•˜๋Š”์ง€, ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ 8์ž ์ด์ƒ์ธ์ง€ ํ™•์ธํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

 

๋งˆ์ง€๋ง‰์œผ๋กœ ์œ„ ์กฐ๊ฑด๋“ค์„ ํ™•์ธํ•ด์„œ ์•ฑ์˜ UI๋ฅผ ํ™œ์„ฑํ™”ํ•˜๊ฑฐ๋‚˜ ๋น„ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ, ์ด ์˜ˆ์ œ์—์„œ ์šฐ๋ฆฌ๋Š” ๋น„๋™๊ธฐ์ , ๋™๊ธฐ์  ์ž‘์—…์„ ๋ชจ๋‘ ํ†ตํ•ฉํ•˜์—ฌ ์ฒ˜๋ฆฌํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ด์ œ ์ปด๋ฐ”์ธ์ด ์–ด๋–ป๊ฒŒ ์ด ์ž‘์—…์„ ๋„์šธ ์ˆ˜ ์žˆ๋Š” ์ง€ ์•Œ์•„๋ณด์ฃ .

๋จผ์ € ๋น„๋ฐ€๋ฒˆํ˜ธ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๊ธฐ์œ„ํ•ด ๋น„๋ฐ€๋ฒˆํ˜ธ ํ•„๋“œ์˜ ๊ฐ’์ด ๋ฐ”๋€Œ๋ฉด ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋„๋ก target action์„ ์ถ”๊ฐ€ํ•ด์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.  ํ•„๋“œ์˜ ๊ฐ’์ด ์—…๋ฐ์ดํŠธ ๋  ๋•Œ๋งˆ๋‹ค text ํ”„๋กœํผํ‹ฐ์— ์ ‘๊ทผํ•ด์„œ ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๊ณ , ํ•ด๋‹น ๊ฐ’์„ ๋‘ ๋ณ€์ˆ˜์— ๊ฐ๊ฐ ์ €์žฅํ•ด์ค๋‹ˆ๋‹ค.

 

ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๋Š” ์ด ์ž‘์—…์„ ๋‹ค๋ฅธ ๋™๊ธฐ์ฒ˜๋ฆฌ ๋™์ž‘๊ณผ ํ•จ๊ป˜ ๋™์ž‘ํ•˜๋„๋ก ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ์ข‹์„๊นŒ์š”?

์•„์ฃผ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. Published๋ฅผ ๊ฐ ํ”„๋กœํผํ‹ฐ์— ์ถ”๊ฐ€ํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

Publisher๋Š” ์Šค์œ„ํ”„ํŠธ 5.1์— ์ถ”๊ฐ€๋˜์–ด ์ฃผ์–ด์ง„ ํ”„๋กœํผํ‹ฐ์— Publisher๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ๋Š” Property Wrapper์ž…๋‹ˆ๋‹ค.

์ฝ”๋“œ์—์„œ ์‚ฌ์šฉํ•˜๋”๋ผ๋„ ํฌ๊ฒŒ ๋‹ฌ๋ผ์ง€๋Š” ๊ฒƒ์€ ์—†์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ”„๋กœํผํ‹ฐ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Published ๋กœ ์ง€์ •๋œ ํ”„๋กœํผํ‹ฐ๋Š” ํŠน๋ณ„ํžˆ ์ด๋ฆ„ ์•ž์— $๊ธฐํ˜ธ๋ฅผ ๋ถ™์ด๋ฉด wrap ๋œ ๊ฐ’์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด Publisher๋‚˜ Subscriber์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  Operator๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ฃ . ์ด ์˜ˆ์ œ์—์„œ๋Š” sink๋ฅผ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ์š”, ๋งŒ์•ฝ ํ”„๋กœํผํ‹ฐ password์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋ฉด subscriber๋Š” ๋ณ€๊ฒฝ๋œ ๊ฐ’์„ ์ „๋‹ฌ๋ฐ›๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ๋‘ ๊ฐœ์˜ Publisher๋ฅผ ๋งŒ๋“ค์—ˆ๊ณ  ๋‘ publisher ๋ชจ๋‘ String์„ output ํƒ€์ž…์„ ๊ฐ€์ง€๊ณ , Never๋ฅผ failure ํƒ€์ž…์œผ๋กœ ๊ฐ€์ง‘๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ํ•˜๊ณ ์‹ถ์€ ๊ฒƒ์€ ํ•˜๋‚˜์˜ ์œ ํšจํ•œ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๋ฐฉ์ถœํ•˜๋Š” ๋ฌด์–ธ๊ฐ€์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ €ํฌ๋Š” ์ด๋Ÿฐ ๋™์ž‘์„ ์ง€์›ํ•˜๋Š” Operator๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

CombineLatest๋ผ๊ณ  ํ•˜์ฃ .

์ฝ”๋“œ๋กœ ๋ด…์‹œ๋‹ค. ์ด์ „๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋‘ ๊ฐœ์˜ Published ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ€์ง€๊ณ , ConbineLatest๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋‘ ๊ฐ’ ์ค‘์— ํ•˜๋‚˜์—๋งŒ ๋ณ€๊ฒฝ์ด ์ƒ๊ฒจ๋„ ์‹ ํ˜ธ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ฒŒํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์‚ฌ์šฉ์ž๊ฐ€ ๋น„๋ฐ€๋ฒˆํ˜ธ ํ•„๋“œ๋ฅผ ๋ชจ๋‘ ์ฑ„์šฐ๊ณ , ๋น„๋ฐ€๋ฒˆํ˜ธ ํ™•์ธํ•„๋“œ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด, ๋น„๋ฐ€๋ฒˆํ˜ธ ํ•„๋“œ๋Š” ๊ธฐ์กด๊ฐ’์„ ๊ณ„์† ์‚ฌ์šฉํ•˜๊ณ , ๋น„๋ฐ€๋ฒˆํ˜ธ ํ™•์ธ ํ•„๋“œ๋Š” ์ƒˆ๋กญ๊ฒŒ ๋ณ€๊ฒฝ๋œ ๊ฐ’์„ ์‚ฌ์šฉํ•˜๊ฒŒ๋ฉ๋‹ˆ๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  ํด๋กœ์ €๋ฅผ ์ถ”๊ฐ€ํ•ด ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ฑ„์šฐ๊ณ , ์œ ํšจ์„ฑ์ด ๊ฒ€์ฆ๋˜๋ฉด ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ์•„๋‹ ๊ฒฝ์šฐ์—๋Š” nil์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. nil์„ ํ†ตํ•ด ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๊ฐ€ ์‹คํŒจํ–ˆ์Œ์„ ์•Œ๋ฆฌ๊ธฐ ์œ„ํ•ด์„œ์ž…๋‹ˆ๋‹ค.

์œ„๋กœ ์˜ฌ๋ผ๊ฐ€ ํƒ€์ž…์„ ํ™•์ธํ•ด๋ด…์‹œ๋‹ค. ์ฝ”๋“œ์— ์ ํ˜€์ ธ ์žˆ๋Š” ๊ทธ๋Œ€๋กœ ํ•ด์„์ด ๋ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋‘ ๊ฐœ์˜ Published ๋œ ๋ฌธ์ž์—ด์„ ๊ฐ€์ง€๊ณ  ์ด๋“ค์˜ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰ ๊ฐ’์„ ์‚ฌ์šฉํ•ด์„œ Optional ํƒ€์ž…์˜ ๋ฌธ์ž์—ด์„ ๋งŒ๋“ค์–ด๋ƒ…๋‹ˆ๋‹ค.  

 

๋งŒ์•ฝ ์ƒˆ๋กœ์šด ์š”๊ตฌ์‚ฌํ•ญ์ด ์ถ”๊ฐ€๋˜์–ด์„œ ์šฐ๋ฆฌ๊ฐ€ ์ง€์ •ํ•œ ํŠน์ •ํ•œ ๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•˜๋„๋ก ํ•ด์•ผํ•œ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ํ• ๊นŒ์š”?

map์„ ์ถ”๊ฐ€ํ•˜๋ฉด ํƒ€์ž…์ด ๋ณ€๊ฒฝ๋œ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. CombineLatest๋กœ ๋‘ ๊ฐ’์„ combine ํ•˜๊ณ  ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋‹ค์‹œ mapํ•  ์ˆ˜ ์žˆ์ฃ . ์กฐ๊ธˆ ๋ณต์žกํ•ด์กŒ๋„ค์š”.

 

์šฐ๋ฆฌ๋Š” ์—ฌ๊ธฐ์„œ๋Š” ํƒ€์ž…์„ ์ค‘์š”ํ•œ ๊ฒƒ์— ์ง‘์ค‘ํ•˜๊ฒŒํ•˜๊ณ  ๋‚˜๋จธ์ง€๋Š” API ์˜์—ญ์— ๋‘๊ณ ์‹ถ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ํ•œ ๊ฐ€์ง€ Operator๋ฅผ ๋” ์ถ”๊ฐ€ํ•ฉ์‹œ๋‹ค.

eraseToAnyPublisher๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Ouput ๊ณผ Failure ํƒ€์ž…์€ ๋ณ€ํ•˜์ง€ ์•Š์ง€๋งŒ ๊ตฌ์ฒด์ ์œผ๋กœ ์–ด๋–ค ์ผ๋“ค์ด ์ผ์–ด๋‚˜๋Š”์ง€๋Š” ์ˆจ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ์š”๊ตฌ์‚ฌํ•ญ์€ ์‚ฌ์šฉ์ž๊ฐ€ ๋น ๋ฅด๊ฒŒ ์‚ฌ์šฉ์ž์ด๋ฆ„์„ ์ž…๋ ฅํ•  ๋•Œ ๋น„๋™๊ธฐ์ฒ˜๋ฆฌ๋กœ ์„œ๋ฒ„์—์„œ ์œ ํšจ์„ฑ๊ฒ€์‚ฌ๋ฅผ ํ•˜๋„๋ก ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๋งŒ๋“ค์—ˆ์„ ๋•Œ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ด๋ฒˆ์—๋„ Published ํ”„๋กœํผํ‹ฐ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋ฒˆ์—๋Š” ์กฐ๊ธˆ ๋‹ค๋ฅธ ๋™์ž‘์ด ์š”๊ตฌ๋ฉ๋‹ˆ๋‹ค. ํ•„๋“œ์— ๋ณ€๊ฒฝ์ด ์ƒ๊ธธ ๋•Œ๋งˆ๋‹ค ์„œ๋ฒ„์— ๊ณ„์†ํ•ด์„œ ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๊ฒƒ์„ ์›ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ด๋ฅผ ์œ„ํ•ด์„œ debounce๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. debounce๋Š” ํŠน์ •ํ•œ ์œˆ๋„์šฐ๋ฅผ ๋งŒ๋“ค๊ณ , ์œˆ๋„์šฐ๋ณด๋‹ค ๋” ๋น ๋ฅด๊ฒŒ๋Š” ๊ฐ’์„ ๊ฐ’์„ ๋ฐ›์ง€ ์•Š๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋” ์ž์„ธํžˆ ์•Œ์•„๋ด…์‹œ๋‹ค.

์šฐ๋ฆฌ๋Š” Publisher๋กœ ํ…์ŠคํŠธํ•„๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ , ์ค‘๊ฐ„์— debounce๋ฅผ ๋‘์—ˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ๋น ๋ฅด๊ฒŒ ํƒ€์ดํ•‘์„ ํ•  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ๊ฐ’์ด debounce๋กœ ์ „๋‹ฌ๋˜์ง€๋งŒ, debounce๋Š” ์ž์‹ ์˜ ์œˆ๋„์šฐ์— ๋งž๊ฒŒ ์†๋„๋ฅผ ์ค„์—ฌ์„œ ๊ฐ’์„ subscriber์—๊ฒŒ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

debounce ๋งŒ์œผ๋กœ๋„ ์ข‹์ง€๋งŒ, ๋” ์ข‹์€ ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ๊ฐ’์ด ๊ฐ™๋‹ค๋ฉด, ์„œ๋ฒ„๋กœ ์ƒˆ๋กœ์šด ์š”์ฒญ์„ ๋ณด๋‚ผ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์—๋ฅผ ๋“ค์–ด ์‚ฌ์šฉ์ž๊ฐ€ Merlin์„ ์ž…๋ ฅํ•ด์„œ Merlin์„ ๋ฐ›์•˜๋‹ค๊ฐ€, n์„ ์ง€์šฐ๊ณ  ๋‹ค์‹œ ์ž…๋ ฅํ•ด์„œ Merlin์„ ๋‹ค์‹œ ๋ฐ›์•˜๋‹ค๋ฉด, ์„œ๋ฒ„์— ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ๋‹ค์‹œ ์š”์ฒญํ•  ํ•„์š”๊ฐ€ ์—†๋Š” ๊ฒƒ์ด์ฃ . 

 

์ด๋ฅผ ์œ„ํ•ด์„œ removeDuplicates๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. removeDuplicates operator๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ™์€ debounce ์œˆ๋„์šฐ ๋‚ด์—์„œ ํ•œ๋ฒˆ ๋ฐœํ–‰๋œ ๊ฐ’์€ ๋‹ค์‹œ ๋ฐœํ–‰๋˜์ง€ ์•Š๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฝ”๋“œ๋กœ๋Š” ์ด๋ ‡๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 0.5์ดˆ ๋™์•ˆ์˜ ์œˆ๋„์šฐ๋ฅผ ๋งŒ๋“ค๊ณ , ์ด ์‹œ๊ฐ„๋™์•ˆ ๋„์ฐฉํ•˜๋Š” ์ค‘๋ณต์„ ๋ชจ๋‘ ์ œ๊ฑฐํ•œ ๋’ค์— ์„œ๋ฒ„์— ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. ์ด ์ฝ”๋“œ๋Š” ์„œ๋ฒ„์ฒ˜๋ฆฌ๋ฅผ ๋” ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์ง€๋งŒ ์•„์ง ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์— ๋Œ€ํ•œ ์ฝ”๋“œ๋Š” ์ž‘์„ฑ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ์ž‘์„ฑ๋˜์–ด์žˆ๋˜ usernameAvailable ํ•จ์ˆ˜๊ฐ€ ์„œ๋ฒ„ ์ž‘์—…์ด ์™„๋ฃŒ๋˜๋ฉด ๊ฒฐ๊ณผ๋ฅผ ๋ฐœํ–‰ํ•˜๋„๋ก ํ•˜๊ณ ์‹ถ์Šต๋‹ˆ๋‹ค.

์•ž์„œ์„œ ๋ฐฐ์› ๋˜ flatMap์„ ์‚ฌ์šฉํ•˜๋ฉด ์ŠคํŠธ๋ฆผ์˜ ๊ฐ’์„ ๋ฐ›์•„ ์ƒˆ๋กœ์šด Publisher๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ ์—ฌ๊ธฐ์„œ ํ•จ์ˆ˜๋ฅผ ์–ด๋–ป๊ฒŒ ํ˜ธ์ถœํ•ด์•ผํ• ๊นŒ์š”?

์šฐ๋ฆฌ๋Š” Future๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  promise๋ฅผ ๋ฐ›๋Š” ํด๋กœ์ €๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. promise๋Š” ์ž‘์—…์˜ ์„ฑ๊ณต, ํ˜น์€ ์‹คํŒจ๋ฅผ ๊ฒฐ๊ณผ๋กœ ๋ฐ›๋Š” ๋˜ ๋‹ค๋ฅธ ํด๋กœ์ €์ž…๋‹ˆ๋‹ค.

 

๊ทธ๋Ÿผ ์ด์ œ usernameAvailable์„ ํ˜ธ์ถœํ•ด๋ด…์‹œ๋‹ค.

์šฐ๋ฆฌ๋Š” ์ŠคํŠธ๋ฆผ์— ๊ฐ’์ด ๋“ค์–ด์™”์„ ๋•Œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , ํ•จ์ˆ˜๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด promise์— ํ•ด๋‹น ๊ฐ’์„ ์ฑ„์›Œ์„œ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

 

์ด ๊ณผ์ •์„ ๋‹ค์‹œ ์ •๋ฆฌํ•ด๋ณด๋ฉด,

์ด๋ ‡๊ฒŒ ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋กœ

๋น„๋ฐ€๋ฒˆํ˜ธ์™€ ๋™์ผํ•œ ํƒ€์ž…์„ ๊ฐ€์ง€๋Š” ์ƒˆ๋กœ์šด Publisher๋ฅผ ๋งŒ๋“ค์–ด๋‚ผ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

 

์ด์ œ ๋งˆ์ง€๋ง‰ ์ž‘์—…์ด ๋‚จ์•˜์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ์—๊ฒŒ๋Š” ๋‘ ๊ฐœ์˜ Publisher๊ฐ€ ์žˆ๊ณ , ์ด๋ฅผ ๋‹ค์‹œ ์กฐํ•ฉํ•ด์„œ UI๋ฅผ ํ™œ์„ฑํ™”ํ• ์ง€, ๋น„ํ™œ์„ฑํ™”ํ• ์ง€ ๊ฒฐ์ •ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

Publisher๋“ค์„ ์กฐํ•ฉํ•˜๋Š” ๊ฒƒ์€ ์ง€๊ธˆ๊นŒ์ง€์™€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. CombineLatest๋กœ ๊ฐ’์ด ์—…๋ฐ์ดํŠธ ๋  ๋•Œ๋งˆ๋‹ค ์‚ฌ์šฉ์ž ์ด๋ฆ„๊ณผ, ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๊ฒ€์‚ฌํ•˜๊ณ  ์ด๋ฆ„๊ณผ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ํŠœํ”Œ๋กœ ๋งŒ๋“ค์–ด ๋ฐ˜ํ™˜ํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ Publisher๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

 

UI๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ๋” ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.

๋ฒ„ํŠผ์„ ํ•˜๋‚˜ ๋งŒ๋“ค๊ณ , ๋ฒ„ํŠผ์˜ subscription ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก AnyCacellable ํ”„๋กœํผํ‹ฐ๋ฅผ ํ•˜๋‚˜ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“ค์—ˆ๋˜ Publisher๋ฅผ ๊ตฌ๋…ํ•˜๋ฉด์„œ ์ƒˆ๋กœ์šด ๊ฐ’์„ map์œผ๋กœ Bool ํƒ€์ž…์œผ๋กœ ๋ณ€๊ฒฝํ•œ ๋’ค์— ๋ฒ„ํŠผ์˜ isEnabled ์†์„ฑ์„ ๋ณ€๊ฒฝํ•œ ๊ฐ’์œผ๋กœ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

 

์˜ค๋Š˜ ์šฐ๋ฆฌ๋Š” ๊ฐ„๋‹จํ•œ ์„ธ ๊ฐœ์˜ ์ž‘์€ Publisher์—์„œ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด Publisher๋“ค์„ ์กฐํ•ฉํ•ด์„œ ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

์ง !

 

์ด๋ ‡๊ฒŒํ•ด์„œ 2019 WWDC ์ปด๋ฐ”์ธ ์„ธ์…˜์— ๋Œ€ํ•œ ๊ณต๋ถ€๊ฐ€ ๋๋‚ฌ์Šต๋‹ˆ๋‹ค! ์•„์ง๋„ ์–ด๋ ต๊ณ  ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•  ๋•Œ ๊ณ ๋ฏผ์ด ๋งŽ์ด ๋˜๋Š” ์ปด๋ฐ”์ธ์ด์ง€๋งŒ ๋Šฅ์ˆ™ํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์œผ๋ฉด ์ข‹๊ฒ ๋„ค์š”ใ…  

 

์˜ค๋Š˜๋„ ์ฝ์–ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!