在 viewDidAppear 中同时呈现两个视图控制器

Presenting two View Controllers at once in viewDidAppear

在我的项目中,我根据应用程序本身的某些标准在 viewDidAppear 中呈现一个视图控制器 (firePromo())。我刚刚完成了将在 viewDidAppear 中呈现的另一个视图控制器 (firePromo2()) 的集成。

两个视图控制器都按预期运行和显示...但是有可能在启动时同时触发两个视图控制器。当然 - 概率很低,但仍有机会。

我的代码如下:

func firePromo() {
    hasShownPromo = true
    // ...
    self.present(promoView, animated: true, completion:nil)
}

func firePromo2() {
    hasShownPromo2 = true
    // ...
    self.present(promoView2, animated: true, completion:nil)
}


override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    if hasShownPromo == false {
        if !UserDefaults.standard.bool(forKey: "hasWatchedPromo") {
            let promoLaunchCounterFromKey = UserDefaults.standard.integer(forKey: "launchCountForPromoKey")                
            if promoLaunchCounterFromKey == 4 || promoLaunchCounterFromKey == 9 || promoLaunchCounterFromKey == 14 {
                firePromo()
            }
        }
    }

    if hasShownPromo2 == false {
        if !UserDefaults.standard.bool(forKey: "hasWatchedPromo2") {                
            let promoLaunchCounterFromKey2 = UserDefaults.standard.integer(forKey: "launchCountForPromoKey2")
            if (promoLaunchCounterFromKey2 % 5) == 0 {
                firePromo2()
            }
        }
    }

}

我意识到在上面的代码中, firePromo() 和 firePromo2() 不会同时计算(5 != 可被 4 / 9 整除) / 14) - 但是,appDelegate 中的 promo2 涉及额外的逻辑。所以有机会双方都会评估。

如果这两个 View Controller 将同时触发,那么安全处理这两个 View Controller 的呈现的最佳方法是什么?

编辑:早期return方法。

if promoLaunchCounterFromKey == 4 || promoLaunchCounterFromKey == 9 || promoLaunchCounterFromKey == 14 {
    firePromo()
    return
}

也在firePromo2()后面加一个return。不过只是一个建议;将所有 fire 促销代码隔离到一个不同的方法中,并从 viewDidAppear: 调用该方法。这样,当方法 return 提早时,您不会阻塞 viewDidAppear:.