[iOS-WWDC2019] Combine ์ฌ์ฉํ๊ธฐ (2) - Subscriber
Combine in Practice
์ง๋ ํฌ์คํธ์ ์ด์ด์ ์ธ์ ์ ๋๋จธ์ง ๋ถ๋ถ์ธ Subscriber ์ฃผ์ ์ ๋ํด ์ ๋ฆฌํด๋ณด๊ฒ ์ต๋๋ค! ์ค์ญ์ด๋ ์์ญ์ด ์์ ์ ์์ผ๋ ๋ ์์ธํ๊ณ ๋ช ํํ ๋ด์ฉ์ ์๋ ์ธ์ ์์ ํ์ธํด๋ณด์ธ์!
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 ์ปด๋ฐ์ธ ์ธ์ ์ ๋ํ ๊ณต๋ถ๊ฐ ๋๋ฌ์ต๋๋ค! ์์ง๋ ์ด๋ ต๊ณ ์ค์ ๋ก ์ฌ์ฉํ ๋ ๊ณ ๋ฏผ์ด ๋ง์ด ๋๋ ์ปด๋ฐ์ธ์ด์ง๋ง ๋ฅ์ํ๊ฒ ์ฌ์ฉํ ์ ์๊ฒ ๋์์ผ๋ฉด ์ข๊ฒ ๋ค์ใ
์ค๋๋ ์ฝ์ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค!
'๐ ์์ด-์ค-์์ค > ๐ฑ iOS ๊ฐ๋ฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
-
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ
-
์นด์นด์คํก
์นด์นด์คํก
-
๋ผ์ธ
๋ผ์ธ
-
ํธ์ํฐ
ํธ์ํฐ
-
Facebook
Facebook
-
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ
-
๋ฐด๋
๋ฐด๋
-
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
-
Pocket
Pocket
-
Evernote
Evernote