2017-05-20 5 views
0

私のプロジェクトでは、アプリケーション内の特定の基準に基づいてviewDidAppearにView Controller(firePromo())を提示しています。私は、viewDidAppearで表示される別のView Controller(firePromo2())の統合を完了しました。viewDidAppearで同時に2つのView Controllerを表示

両方のView Controllerが機能し、意図したとおりに表示されます...ただし、両方のView Controllerが同時に起動される可能性があります。認められている - 確率は低いですが、まだチャンスがあります。

私のコードは以下の通りです:

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に関する余分なロジックがあります。だから両方が評価される可能性がある。

この2つのView Controllerの両方を同時に起動する場合、安全にプレゼンテーションを処理するにはどうすればよいでしょうか?

+1

連続するifの代わりにelse/ifテストを実行しますか? – Larme

+0

@Larme - もし私が "else if hasShownPromo2 == false"を実行した場合 - firePromo()とfirePromo2()の両方が同時に発生した場合、正しく評価されますか? – Joe

+0

達成したいことに依存します。両方のコントローラを表示する必要がある場合は、どのように表示しますか?例えば。両方のプロモーションVCを子コントローラとしてナビゲーションコントローラを提示することができます。または最初のコントローラーを提示し、一度閉じると2番目のコントローラーが表示されます。 –

答えて

1

EDIT:早期返却方法。

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

firePromo2()の後もリターンを追加します。しかしちょうど提案。すべての火災のプロモーションコードを別個の方法に分離し、その方法をviewDidAppear:から呼び出します。この方法では、メソッドが早期に返されたときには、viewDidAppear:をブロックしていません。

+0

上記の@dr_barto宛ての返信をご覧ください。 – Joe

+0

私は一度に1つのプロモーションを表示させたいと思っています。私はあなたが「同時に」と言っていることを確信しています。 firePromoメソッドに非同期のものがありますか?すべてがメインスレッドに残っていれば、同時に何か起こっているとは思わないでしょう。 – johncederholm

+0

何も非同期で、すべてメインスレッド上にあります。同時に「同時に」 - 私は、両方のfirePromoメソッドが同時に評価する可能性があることを意味します。したがって、アプリケーションはすぐに2つのVCを提示する必要があります。私は避けたい '警告:<_>を表示すると、そのビューはウィンドウ階層にありません。<_>!'生産中。希望は意味をなさない:) – Joe

関連する問題