2017-05-20 36 views
0

在我的项目中,我基于App本身内的某些条件在viewDidAppear中呈现View Controller(firePromo())。我刚刚完成了将在viewDidAppear中呈现的另一个View Controller(firePromo2())的集成。一次在viewDidAppear中呈现两个视图控制器

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

我的代码如下:

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还有额外的逻辑。所以两者都有可能评估。

安全地处理这两个视图控制器的呈现,如果两者都会同时触发,最好的方法是什么?

+1

做一个其他/如果测试,而不是连续的,如果? – Larme

+0

@Larme - 如果我这样做“否则如果hasShownPromo2 == false” - 在同时触发的情况下,只是firePromo()会评估,而不是firePromo2(),正确吗? – Joe

+0

取决于你想要达到的目标。如果两个控制器都应该显示,你希望他们如何显示?例如。您可以将两个promo VC作为子控制器提供导航控制器;或者你可以出示第一个控制器,一旦它关闭,出现第二个控制器。 –

回答

1

编辑:提前返回的方法。

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

也在firePromo2()之后添加回报。只是一个建议;将所有的消防促销代码分离成一个独特的方法,并从viewDidAppear:中调用该方法。这样,当方法返回时,您不会阻止viewDidAppear:

+0

查看我上面发布的针对@dr_barto的回复。 – Joe

+0

我假设你只想要一个宣传片一次展示。我不确定你的意思是“在同一时间”。你的firePromo方法中有没有异步的东西?如果一切都停留在主线上,那么我认为你不应该同时遇到任何事情。 – johncederholm

+0

没有异步,全部在主线程上。通过“在同一时间” - 我只是意味着firePromo方法可能同时评估的机会。因此,应用程序将不得不一次呈现两个VC。我想避免'警告:试图在<_>上显示<_>,其视图不在窗口层次结构中!'在生产中。希望有道理:) – Joe

相关问题