DispatchQueue.main.async が非同期処理ということは理解できています。
今回、 viewDidLoad 内で checkIfUserIsLoggedIn メソッドを実行して、まだログインができていないならログイン画面を表示させる仕様です。
この時 DispatchQueue.main.async を使わないと UIが構築されずに画面が真っ黒なままになってしまいます。
ここで疑問なのですが、非同期処理にしなくてもUIの構築はされるのかなと思うのですが、なぜ DispatchQueue.main.async がないとUIが構築されない(ログイン画面が表示されない)のでしょうか?
そもそもなぜ他に並行処理を行う記述がないのに非同期処理を行う必要があるのでしょうか?
まだSwiftの理解が浅いので、ご教授いただけるとありがたいです。
よろしくお願いします。
import UIKit import Firebase class HomeController: UIViewController { // MARK: - Property private let topStack = HomeNavigationStackView() private let bottomStack = BottomControlsStackView() private let deckView = UIView() // MARK: - Lifecycle override func viewDidLoad() { super.viewDidLoad() // logout() checkIfUserIsLoggedIn() } // MARK: - API //すでにログインしているかをチェック func checkIfUserIsLoggedIn() { if Auth.auth().currentUser == nil { DispatchQueue.main.async { let nav = UINavigationController(rootViewController: LoginController()) nav.modalPresentationStyle = .fullScreen self.present(nav, animated: true, completion: nil) } } else { configureUI() configureCard() } } func logout() { do { try Auth.auth().signOut() } catch let error { print("log out error (error.localizedDescription)") } } // MARK: - Helper func configureCard() { let user1 = User(name: "Jane Doe", age: 22, images: [UIImage(named: "jane1")!, UIImage(named: "jane2")!, UIImage(named: "jane3")!]) let user2 = User(name: "Kelly", age: 21, images: [UIImage(named: "kelly1")!, UIImage(named: "kelly2")!, UIImage(named: "kelly3")!]) let cardView1 = CardView(viewModel: CardViewModel(user: user1)) let cardView2 = CardView(viewModel: CardViewModel(user: user2)) deckView.addSubview(cardView1) deckView.addSubview(cardView2) //cardViewの大きさを superView(deckView)の大きさに合わせる cardView1.fillSuperview() cardView2.fillSuperview() } func configureUI() { view.backgroundColor = .white view.addSubview(topStack) topStack.anchor(top: view.safeAreaLayoutGuide.topAnchor, left: view.leftAnchor, right: view.rightAnchor, paddingTop: 16, height: 40) view.addSubview(bottomStack) bottomStack.anchor(left: view.leftAnchor, bottom: view.safeAreaLayoutGuide.bottomAnchor, right: view.rightAnchor, paddingBottom: 16, height: 80) view.addSubview(deckView) deckView.anchor(top: topStack.bottomAnchor, left: view.leftAnchor, bottom: bottomStack.topAnchor, right: view.rightAnchor, paddingTop: 16, paddingLeft: 14, paddingBottom: 16, paddingRight: 14) } }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/08/02 05:05
2020/08/02 09:37