๋ณธ ํฌ์คํ ์ ๊ณฐํ๊น๋์ ๊ฐ์์์์ ๊ธฐ๋ฐ์ผ๋ก, ๊ฐ์ธ์ ์ผ๋ก ๊ณต๋ถํ ๋ด์ฉ์ ์ ๋ฆฌํ ๊ธ์ ๋๋ค. ๋์ฑ ์์ธํ ๋ด์ฉ์, ๊ฐ์ ์์์ ์ง์ ์์ฒญํ์๋๊ฒ์ ์ถ์ฒ๋๋ฆฝ๋๋ค! ์ด๋ฒ ๊ธ์์๋ ๊ฐ๋จํ๊ฒ Driver๊ฐ ๋ฌด์์ธ์ง์ ๋ํด์ ๊ฐ๋จํ๊ฒ ์ ๋ฆฌ ํด ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค! ๊ธ ๋ง๋ฌด๋ฆฌ์, 5์ค์์ฝ์ผ๋ก ๊ฐ๋จํ๊ฒ ์ ๋ฆฌ ํ ๋ด์ฉ๋ ์์ผ๋ ์๊ฐ์ด ์์ผ์ ๋ถ๋ค์ ์ฐธ๊ณ ํด์ฃผ์ธ์. ์ด์ ํฌ์คํ ์์ RxCocoa๋ฅผ ์ค๋ช ํ ๋ 'UIKit์ Rx์์๋ค์ ์ ์ฉ์ํจ Extentsion'์ด๋ผ๊ณ ์ค๋ช ํ์ต๋๋ค. ์๋ฅผ ๋ค๋ฉด, ์๋์ ๊ฐ์ ์ฝ๋๊ฐ RxCocoa๋ฅผ ํ์ฉํ์ฌ UIKit์ ์ง์ ์ ์ผ๋ก Observable์ ๋ฐ์ธ๋ฉ ํ ์์์ ๋๋ค. viewModel.itemsCount .map{"\($0)"} .observeOn(MainScheduler.instanc..
๋ณธ ํฌ์คํ ์ ๊ณฐํ๊น๋์ ๊ฐ์์์์ ๊ธฐ๋ฐ์ผ๋ก, ๊ฐ์ธ์ ์ผ๋ก ๊ณต๋ถํ ๋ด์ฉ์ ์ ๋ฆฌํ ๊ธ์ ๋๋ค. ๋์ฑ ์์ธํ ๋ด์ฉ์, ๊ฐ์ ์์์ ์ง์ ์์ฒญํ์๋๊ฒ์ ์ถ์ฒ๋๋ฆฝ๋๋ค! ์ด์ ์ ํฌ์คํ ํ RxSwift + MVVMํจํด [Subject๋ฅผ ํ์ฉํด๋ณด์]์ ์ด์ด์ง๋ ํฌ์คํ ์ ๋๋ค. ์ ๋ฒ ํฌ์คํ ๋ง๋ฏธ์ ๋์๋ RxCocoa์ ๋ํด ๊ฐ๋จํ๊ฒ ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. RxCocoa๋ฅผ ์์ฝํ์๋ฉด, [RxSwift์ ์์๋ค์ UIKit์ ์ ์ฉํ ์ ์๋๋ก extension ์์ผ์ ์ ๋ชฉ์ํจ ๊ฒ] ์ด๋ผ๊ณ ์ค๋ช ํ ์ ์์ต๋๋ค. ๊ธ๋ก๋ง ๋ณด๋ฉด ์ฝ๊ฒ ์ดํด๊ฐ ๋์ง ์์ผ๋, ์์๋ฅผ ํตํด ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. override func viewDidLoad() { super.viewDidLoad() viewModel.itemsCount .subscrib..
๋ณธ ํฌ์คํ ์ ๊ณฐํ๊น๋์ ๊ฐ์์์์ ๊ธฐ๋ฐ์ผ๋ก, ๊ฐ์ธ์ ์ผ๋ก ๊ณต๋ถํ ๋ด์ฉ์ ์ ๋ฆฌํ ๊ธ์ ๋๋ค. ๋์ฑ ์์ธํ ๋ด์ฉ์, ๊ฐ์ ์์์ ์ง์ ์์ฒญํ์๋๊ฒ์ ์ถ์ฒ๋๋ฆฝ๋๋ค! ์ด์ ์ ํฌ์คํ ํ [RxSwift] #3) RxSwift๋ฅผ ํ์ฉํ MVVMํจํด [1] ์ ์ด์ด์ง๋ ํฌ์คํ ์ ๋๋ค. ๋ํ, ์ด๋ฒ ๊ธ๋ถํฐ ์ฝ๋๋ด์ฉ์ ์บก์ณ ํ์์ด ์๋, ์ฝ๋๋ธ๋ญ ํ์์ผ๋ก ์์ฑ ํ ์์ ์ ๋๋ค! ์ด์ ํฌ์คํ ์์ Observable๋ก ์์ฑํ ๋ณ์๋ฅผ, ๊ตฌ๋ ํ ์ดํ์๋ ์ง์์ ์ธ ๊ฐ์ ๋ณ๊ฒฝ์ ๊ด์ฐฐํด์ผํ๋ ํ์๊ฐ ์๊ฒจ ์ด๋ฅผ์ํด Observable์ Subject๋ก ๊ตฌํํด์ผ ํ ํ์๊ฐ ์๋ค๊ณ ํ์์ต๋๋ค. (Subject์ ๋ํ ์ค๋ช ์ ์ด ๊ฒ์๋ฌผ์ ์ฐธ๊ณ ํด์ฃผ์ธ์!) class MenuListViewModel{ var menus : [Menu] = [ Menu..
๋ณธ ํฌ์คํ ์ ๊ณฐํ๊น๋์ ๊ฐ์์์์ ๊ธฐ๋ฐ์ผ๋ก, ๊ฐ์ธ์ ์ผ๋ก ๊ณต๋ถํ ๋ด์ฉ์ ์ ๋ฆฌํ ๊ธ์ ๋๋ค. ๋์ฑ ์์ธํ ๋ด์ฉ์, ๊ฐ์ ์์์ ์ง์ ์์ฒญํ์๋๊ฒ์ ์ถ์ฒ๋๋ฆฝ๋๋ค! Subject ๋? ์ด์ ํฌ์คํ ๋ง๋ฏธ์, Subeject๋ผ๋ ๊ฒ์ ์ ๊น ์๊ฐํ์์ต๋๋ค. ์ดํ ํ๋ก์ ํธ์์๋ Subject๋ฅผ ๋ค๋ฃจ๋ ๋ด์ฉ์ด ๋ง์ด ๋์์, ์ด Subject์ ๋ํด ๊ฐ๋จํ๊ฒ ์ ๋ฆฌํ๋ ค๊ณ ํฉ๋๋ค. Subject๋ฅผ ๊ฐ๋จํ ์ ๋ฆฌํ๋ฉด, Observable์ ํ๋ฆ์ ๋ฒ์ด๋ ์ธ๋ถ์์๋, ๋ฐ์ดํฐ๋ฅผ ์ปจํธ๋กค ํ์ฌ ์๋ก์ด ๊ฐ์ ์ง์ด๋ฃ์ด์ฃผ๋ ๋ ์์ ๋๋ค. ReactiveX ๊ณต์๋ฌธ์๋ฅผ ์ฐพ์๋ณด๋ฉด Subject์ ์ข ๋ฅ์๋ 4๊ฐ์ง๊ฐ ์์ต๋๋ค. 1) AsyncSubject 2) BehaviorSubject 3) PublishSubject 4) ReplaySubject ๊ฐ..
๋ณธ ํฌ์คํ ์ ๊ณฐํ๊น๋์ ๊ฐ์์์์ ๊ธฐ๋ฐ์ผ๋ก, ๊ฐ์ธ์ ์ผ๋ก ๊ณต๋ถํ ๋ด์ฉ์ ์ ๋ฆฌํ ๊ธ์ ๋๋ค. ๋์ฑ ์์ธํ ๋ด์ฉ์, ๊ฐ์ ์์์ ์ง์ ์์ฒญํ์๋๊ฒ์ ์ถ์ฒ๋๋ฆฝ๋๋ค! 1. ํ๋ก์ ํธ๋ฅผ MVVM ํจํด์ผ๋ก ๊ตฌ์ฑํ๊ธฐ ๊ฐ๋จํ ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉด์, RxSwfit์ ์ค์ ์ ์ฉ์ฌํญ์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค. ์ฐ์ ํด๋น ํ๋ก์ ํธ๋ MVVMํจํด์ ๊ธฐ๋ฐ์ผ๋ก ์์ฑ๋๋ ํ๋ก์ ํธ์ ๋๋ค. ์งํํ ํ๋ก์ ํธ์ ๊ธฐ๋ณธ ํด๋๊ตฌ์กฐ์, View ํ๋ฉด์ ์๋์ ๊ฐ์ต๋๋ค. 1) Model : APIService๋ก ๋ฐ์์ฌ rawData ๊ตฌ์กฐ ํ์ผ 2) APIService : Menu์ Model๋ก fetching ํด์ค๋ API๊ฐ URLSession์ผ๋ก ์์ฑ ๋์ด์์ 3) MenuViewController : tabelView๋ก ๊ตฌ์ฑ๋ ํ ํ๋ฉด ViewContr..
ํด๋น ํฌ์คํธ๋ ๊ณฐํ๊น๋์ ๊ฐ์์์์ ๊ฐ์ธ์ ์ผ๋ก ๊ณต๋ถํ ๋ด์ฉ์ ์ ๋ฆฌํ ๊ธ์ ๋๋ค. ์์ธํ ๋ด์ฉ์ ์์์ ์ง์ ๋ณด์๋๊ฒ์ ์ถ์ฒ๋๋ฆฝ๋๋ค..! 1. Operator๋? RxSwift์ ์ฉ๋๋ฅผ ๋ค์ ์ ๋ฆฌํด๋ณด๋ฉด, ๋น๋๊ธฐ์ ์ผ๋ก ์๊ธฐ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฆฌํด๊ฐ์ผ๋ก ์ ๋ฌํ๊ธฐ ์ํด Observable์ด๋ผ๋ ํด๋์ค๋ก ๊ฐ์ธ์ ์ ๋ฌํ๊ธฐ ์ํจ ์ผ๋ก ์ ๋ฆฌํ ์ ์์ต๋๋ค. ์์ ์ฌ์ง 2์ฅ์ ์ด๋ฌํ RxSwift๋ฅผ ์ฌ์ฉํ ๊ฐ์ฅ ๊ธฐ์ด์ ์ธ ์ฝ๋ ์ ๋๋ค. ๊ทธ๋ฐ๋ฐ onError() / onNext() / onCompleted() ๋ถํฐ ์์ํด์ ~ .next() / .error() / .completed() ๊น์ง,,,, ๊ธฐ๋ณธ์ ์ธ ์ฝ๋์กฐ์ฐจ๋ ๋๋ฌด ์จ์ผํ๋ ๊ฒ๋ค์ด ๋ง๊ณ ๋ณต์กํด ๋ณด์ ๋๋ค. ๊ทธ๋์, Rx์๋ ์ด๋ฐ ๊ท์ฐฎ์ ์ฝ๋๋ค์ ๊ฐํธํ๊ฒ ์ค์ฌ์ฃผ๋ ๋ฌธ๋ฒ๋ค์ด ์กด์ฌ..
ํด๋น ๊ธ์, ๊ณฐํ๊น๋์ [RxSwift 4์๊ฐ์ ๋๋ด๊ธฐ ์์ฆ2] ์์์ ๋ณด๋ฉด์ ์ค์ค๋ก ๊ณต๋ถํ๋ฉฐ ์ ๋ฆฌํ ๋ด์ฉ์ ๋๋ค. ์๋ฌด๋๋ ๊ณต๋ถ ํ ๋ด์ฉ์ ์ ๋ฆฌํ๋ ๋ชฉ์ ์ผ๋ก ์์ฑํ๊ธฐ ๋๋ฌธ์, ๋ด์ฉ์ ๋ํ ์์์ ์ธ ํด์์ด ๋ง์ด ๋ค์ด๊ฐ ์์ ์ ์์ต๋๋ค ๐ญ ๋ฐ๋ผ์, RxSwift๋ฅผ ์ ๋๋ก ๊ณต๋ถ ํด ๋ณด๊ณ ์ถ์ผ์ ๋ถ๋ค์ ๊ณฐํ๊น๋์ ๊ฐ์๋ฅผ ์ง์ ๋ค์ผ์๋ฉฐ ๊ณต๋ถ ํด ๋ณด์๋๊ฒ์ ์ถ์ฒ ๋๋ฆฝ๋๋ค!!! RxSwift ๊ฐ๋ ์ก๊ธฐ (๋ฑ์ฅ ๋ฐฐ๊ฒฝ + ๊ธฐ๋ณธ ๊ตฌ์กฐ) ์ข์ธก์ ์ฝ๋๋ฅผ ๋์ ์์ผ์, ์ฐ์ธก๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ ธ์ค๊ฒ ํ๊ณ ์ถ๋ค. ์ด๋, ์ ์์ ์ผ๋ก ๋์ ํ๋ค๋ฉด 1. ์ธ๋์ผ์ดํฐ UI๋ ธ์ถ 2. ์๊ฐ์ ๊ณ์ ํ๋ฌ๊ฐ 3. ๋ฐ์ดํฐ ๋ฐ์์ค๋ฉด text๋ก ํํ ์ด 3๊ฐ์ง์ ๋์์ด ๋์์ ์ด๋ค์ ธ์ผํ์ง๋ง, ์ค์ ๋ก๋ ์ธ๋์ผ์ดํฐ๋ ๋ ธ์ถ์ด ์๋๊ณ ๋คํธ์ํน ๋์์ด ์ผ์ด๋๋ ..