2017-05-20 8 views
0

내 프로젝트에서는 응용 프로그램 자체의 특정 기준에 따라 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

연속적인 if 대신 else/if 테스트를 수행 하시겠습니까? – Larme

+0

@Larme - 그렇다면 "else hasShownPromo2 == false"- 동시에 두 개의 fire가 동시에 발생하면 firePromo()가 평가되고 firePromo2()는 정확하지 않습니까? – Joe

+0

달성하고자하는 바에 달려 있습니다. 두 컨트롤러를 모두 표시해야하는 경우 어떻게 표시합니까? 예 : 프로모션 VC를 하위 컨트롤러로 사용할 수있는 탐색 컨트롤러를 제공 할 수 있습니다. 또는 첫 번째 컨트롤러를 제시하고 일단 닫으면 두 번째 컨트롤러를 표시 할 수 있습니다. –

답변

1

EDIT : 조기 귀국 방법.

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

너무 firePromo2() 후 수익을 추가합니다. 그래도 그냥 제안; 모든 화재 홍보 코드를 별개의 방법으로 분리하고이 방법을 viewDidAppear:에서 호출하십시오. 이렇게하면 메서드가 일찍 반환 될 때 viewDidAppear:을 차단하지 않습니다.

+0

@dr_barto에게 보낸 위의 답장을 확인하십시오. – Joe

+0

한 번에 하나의 프로모션 만 보여주고 싶다고 가정합니다. 나는 당신이 "동시에"의미하는 바를 확신하지 못합니다. firePromo 메소드에 비동기적인 요소가 있습니까? 모든 것이 메인 스레드에 남아 있다면, 나는 당신이 동시에 일어나는 일이 있어서는 안된다고 생각합니다. – johncederholm

+0

비동기, 아무것도 메인 스레드에서. 동시에 "동시에"- 나는 firePromo 두 메소드가 동시에 평가할 수있는 기회가 있다는 것을 의미합니다. 따라서 앱은 두 개의 VC를 동시에 표시해야합니다. 나는 경고를 피하고 싶다 : <_>에 <_>을 표시하려고 시도하면 창 계층 구조에보기가 표시되지 않는다. ' 생산에서. 희망은 그 말이 맞는 :) – Joe