2017-05-20 38 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

相關問題