
๋ค๋ฅธ LiveData ๊ฐ์ฒด๋ฅผ observeํ๊ณ ํด๋น ๊ฐ์ฒด์ OnChanged ์ด๋ฒคํธ๋ฅผ ๋ฐ๋ LiveData ํ์ ํด๋์ค์ด๋ค.
addSource() ๋ฉ์๋๋ฅผ ํตํด observeํ LiveData์ ์ํํ ๋ก์ง์ ์ ๋ฌํ์ฌ ์ถ๊ฐํ๊ณ , removeSource() ๋ฉ์๋๋ฅผ ํตํด ์ ๊ฑฐํ๋ค.
MediatorLiveData์ ํ์ฑ/๋นํ์ฑ ์ํ๋ฅผ onActive(), onInactive() ๋ฉ์๋๋ฅผ ํตํด ์ถ๊ฐํ ํ์ LiveData ๊ฐ์ฒด์ ์ ๋ฌํ๋ค.
์ ๋ฆฌํด๋ณด๋ฉด MediatorLiveData์ ํ๋ ๋๋ ์ฌ๋ฌ ๊ฐ์ LiveData๋ฅผ ์ถ๊ฐํ์ฌ ์ถ๊ฐ๋ LiveData์ onChanged ์ฝ๋ฐฑ์ ๋ฐ์ ์ฒ๋ฆฌํ ์ ์๋ค. ์ฝ๋๋ฅผ ํตํด ์ดํด๋ณด์.
.png)
MediatorLiveData๋ MutableLiveData๋ฅผ ์์ํ๊ณ ์์ด ๊ฐ ๋ณ๊ฒฝ์ด ๊ฐ๋ฅํ๋ค. ๋ํ LiveData์ Source๋ฅผ ์ ์ฅํ Map์ ๊ฐ์ง๊ณ ์๋ค.
.png)
Source์๋ LiveData์ onChanged ์ถ์ ๋ฉ์๋๊ฐ ํฌํจ๋ Observer ์ธํฐํ์ด์ค๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ Observer๋ฅผ implements ํ๊ณ ์๋ค.
์ ๋ฌ๋ฐ์ LiveData์ onChanged() ์ฝ๋ฐฑ ๋ฑ๋ก์ ์ํ plug(), unplug() ๋ฉ์๋๋ฅผ ๊ฐ์ง๊ณ ์๊ณ onChanged() ์ฝ๋ฐฑ์ ๋ฐ์ผ๋ฉด mObserver.onChanged(v);๋ฅผ ํธ์ถํ๋ค.
์ฌ๊ธฐ์ Source๋ LiveData๋ฅผ ์ต์ ธ๋นํ๋ฉฐ ๋ณํ๋ฅผ ๊ฐ์งํ์ ๋ ์ ๋ฌ๋ฐ์ Observer์ onChanged๋ฅผ ํธ์ถํ๋ค๋ ๊ฒ์ ์ ์ ์์๋ค.
.png)
Source ๊ฐ์ฒด๋ฅผ ์ ๋ฌ๋ฐ์ LiveData์ Observer๋ฅผ ์ด์ฉํด ์์ฑํด ์ฃผ๊ณ mSources์ ์ ์ฅํ ๋ค MediatorLiveData๊ฐ ์กํฐ๋ธ ์ํ์ผ ๊ฒฝ์ฐ ์์ฑํ Source๋ฅผ plug() ์ํ๋ก ๋ณ๊ฒฝํด ์ค๋ค.
.png)
์ ๋ฌ๋ฐ์ LiveData๋ฅผ mSources์์ ์ ๊ฑฐํ๊ณ ํด๋น Source๊ฐ null์ด ์๋ ๊ฒฝ์ฐ unplug() ์ํ๋ก ๋ณ๊ฒฝํ๋ค.
.png)
Activity ๋ฐ Fragment์ Lifecycle ์ํ์ ๋ฐ๋ผ onActive(), onInactive()๊ฐ ํธ์ถ๋๋ฉฐ, mSources์ ์๋ ๋ชจ๋ Source๋ฅผ plug(), unplug() ์ํ๋ก ๋ณ๊ฒฝํ๋ค.
.png)
EditText์ ์
๋ ฅ๊ฐ์ ๋ฐ๋ Two-way-binding์ ์ฌ์ฉํ MutableLiveData ๋ ๊ฐ์ง๊ฐ ์๊ณ MediatorLiveData ํ๋์ ๊ทธ Backing field์ธ LiveData๊ฐ ํ๋ ์๋ค.
init ๋ธ๋ก์ ์ดํด๋ณด๋ฉด addSource ๋ฉ์๋๋ฅผ ์ด์ฉํด ๋ ๊ฐ์ง MutableLiveData์ ์ฝ๋ฐฑ ์ ์ํํ ์ฝ๋๋ฅผ ์ค์ ํ๋ค.
userId, userPassword๊ฐ ๋ณ๊ฒฝ๋ ๋ checkProcess() ๋ฉ์๋๊ฐ ํธ์ถ๋๋ฉฐ _isProcessComplete์ ์ํ๊ฐ ๋ณ๊ฒฝ๋ ๊ฒ์ด๋ค.
LiveData๋ฅผ ๋ณํํ๊ณ ์ ํ ๋ ์ฌ์ฉ๋๋ค.
Transformations์ ํฌํจ๋ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ observer์ lifecycle์ ๊ฑธ์ณ ์ ๋ณด๋ฅผ ์ ๋ฌํ ์ ์๋ค.
Observer๊ฐ ๋ฐํ๋ LiveData ๊ฐ์ฒด๋ฅผ ์ต์ ๋นํ์ง ์๋ ํ ๊ณ์ฐ๋์ง ์๋๋ค. ๊ทธ ์ด์ ๋ Transformations์ด lazy ํ๊ฒ ๊ณ์ฐ๋๊ธฐ ๋๋ฌธ์ ๋ช
์์ ํธ์ถ์ด๋ ์ข
์์ฑ์ ์๊ตฌํ์ง ์๊ณ lifecycle ๊ด๋ จ ๋์์ด ์์์ ์ผ๋ก ์ ๋ฌ๋ฉ๋๋ค.
.png)
์์ ์์๋ณธ MediatorLiveData๋ฅผ ํ์ฉํ๊ณ ์๋ค.
์๋ก์ด MediatorLiveData ๊ฐ์ฒด๋ฅผ ์์ฑํด ์ ๋ฌ๋ฐ์ LiveData์ mapFunction์ ๋ํด์ฃผ๋ฉฐ ๋ฐํํ๋ค. onChanged()์์ mapFunction์ ๊ฒฐ๊ณผ๋ฅผ MediatorLiveData ๊ฐ์ฒด์ set ํ๋ค. ์ ๋ฌ๋ฐ์ LiveData์ ๊ฐ์ด ๋ณ๊ฒฝ๋๋ฉด ๋ฐํ๋ MediatorLiveData ๊ฐ์ฒด์ set ์์
์ด ์ํ๋ ๊ฒ์ด๋ค.
mapFunction์ ๋ฉ์ธ ์ค๋ ๋์์ ์คํ๋๋ค.
.png)
userLiveData๋ฅผ ์ต์ ธ๋น ํ๊ณ ์์ผ๋ฉฐ ๊ฐ ๋ณ๊ฒฝ์ด ์ผ์ด๋ฌ์ ๋ ํจ์์ ๊ฒฐ๊ณผ๋ฅผ ์ค์ ํด ์ค๋ค.
.png)
onChanged()๋ฅผ ์ดํด๋ณด๋ฉด ํจ์์ ๊ฒฐ๊ณผ๋ก ๋ฐ์ LiveData์ mSource๋ฅผ ๋น๊ตํ์ฌ ๋์ผํ๋ฉด ์๋ฌด ์์
๋ ์ํํ์ง ์๋๋ค. ๋ค๋ฅผ ๊ฒฝ์ฐ ๊ธฐ์กด Source๋ ์ ๊ฑฐํ๋ฉฐ ๊ฒฐ๊ณผ๋ก ๋ฐ์ LiveData๋ฅผ map()๊ณผ ๋์ผํ ๋ฐฉ์์ผ๋ก ์ถ๊ฐํด ์ค๋ค.
switchMapFunction์ ๋ฉ์ธ ์ค๋ ๋์์ ์คํ๋๋ค.
.png)
setUserId() ๋ฉ์๋๊ฐ ํธ์ถ๋ ๋ repository.getUserById(it) ํจ์๊ฐ ํธ์ถ๋๋ฉฐ ๊ธฐ์กด LiveData์ ๋์ผํ์ง ๋น๊ตํ๋ค. ๋ค๋ฅผ ๊ฒฝ์ฐ ํด๋น ๊ฒฐ๊ณผ๊ฐ ์ ์ฉ๋๋ค.