๋ฌธ์ ์ํฉ
UIKit์ ์ด์ฉํ์ฌ ๊ฐ์ธ ํ๋ก์ ํธ๋ฅผ ๊ฐ๋ฐํ๋ ๊ณผ์ ์์ Firebase Auth์์ ์ ๊ณตํ๋ Google Login๋ฅผ ๊ตฌํํ๋ค๊ฐ ๋ฌธ์ ๋ฅผ ๋ง์ฃผํ๊ฒ ๋์์ต๋๋ค. ํ๋ฉด ๋์์ ์ ๊ตฌํ ๋์์ง๋ง ๊ตฌ๊ธ ๋ก๊ทธ์ธ ๋ฒํผ์ ๋๋ฅด์ ์๋์ ๊ฐ์ ์๋ฌ ๋ฉ์์ง๋ฅผ ๋ณด๊ฒ ๋์์ต๋๋ค.
API๋ฅผ ํตํด ๊ฐ์ ธ์จ ๋ฐ์ดํฐ๋ก UI๋ฅผ ์ ๋ฐ์ดํธํ ๋๋ Main Thread์์ ๋์ํด์ผํฉ๋๋ค. ํ์ง๋ง ํ์ฌ Background Thread์์ ์คํํ๊ณ ์๊ธฐ ๋๋ฌธ์ ๋ฐ์ํ ์ด์์์ต๋๋ค.
MainActor์ ์ฌ์ฉํ์ฌ ๋ฌธ์ ํด๊ฒฐ
์ฒ์์๋ ๊ตฌ๊ธ ๋ก๊ทธ์ธ ๋ก์ง์ ViewModel์์ async/await์ ViewController์์ Task๋ฅผ ์ฌ์ฉํ๋ฉด์ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ์ ํ๊ณ ์๋ค๊ณ ์๊ฐํ์ต๋๋ค.
Completion Handler๋ ์ฌ์ฉํ์ง ์์ผ๋ ์ด๋ป๊ฒ ๋ฉ์ธ ์ค๋ ๋๋ก ๋์คํจ์นํด์ฃผ์ด์ผ ํ๋์ง ๋ชฐ๋์ต๋๋ค.
DisapatchQueue.main.async๋ก ์๋ ํธ์ถํด์ค ์๋ ์๊ฒ ์ง๋ง ๋ง์ฝ ๊ตฌ๊ธ ๋ก๊ทธ์ธ์ ์ฌ๋ฌ ๊ตฐ๋ฐ์์ ํ๊ฒ ๋๋ค๋ฉด ๋งค๋ฒ ํธ์ถํด์ฃผ์ด์ผํ๋ ์ ์ง๋ณด์๋ฅผ ์๊ฐํด์๋ผ๋ ์ข์ ๋ฐฉ๋ฒ์ ์๋ ๊ฒ ๊ฐ์์ต๋๋ค.
์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ์ ์๊ฒ ๋ ๊ฒ์ด MainActor ์์ต๋๋ค. ์๋์ผ๋ก ํธ์ถํด์ฃผ์ด์ผ ํ๋ DisapatchQueue์ ๋ฌ๋ฆฌ ํด๋์ค ์์ @MainActor ์ด๋ ธํ ์ด์ ์ ๋ถ์ฌ์ฃผ์ด์ ํญ์ ๋ฉ์ธ ์ค๋ ๋์์ ์์ ์ ์ํํ๋๋ก ์๋์ผ๋ก ๋ผ์ฐํ ํด์ฃผ๋๋ก ๊ตฌํํ์๊ณ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์์ต๋๋ค.
@MainActor
final class LoginViewModel {
// ...
}
๋ง์น๋ฉฐ
์ด๋ฒ ๋ฌธ์ ์ํฉ์ ์ง์ ๊ฒช์ด๋ณด์ง ์์์ผ๋ฉด ๋ชฐ๋์ ๊ฒ๋ค์ด๋ผ๊ณ ์๊ฐํ์ต๋๋ค... ์ด๋ฒ ์ํฉ์ ๊ณ๊ธฐ๋ก Thread์ @MainActor์ ๋ํด์ ๊ณต๋ถํ๋ ์๊ฐ์ ๊ฐ์ ธ์ผ๊ฒ ๋ค๊ณ ์๊ฐํ์ต๋๋ค.