2016-11-07 3 views
0

내 응용 프로그램에서 사용자 질문을하고 대답을 얻습니다. 각 질문에 응답을위한 일정 시간 (예 : 30 초)이 있습니다. 'Last (n) seconds ...'와 같은 사용자 알림을 표시하고 사용자가 그 시간에 응답하지 않으면 앱에서 질문을 건너 뜁니다. 는 DispatchQueue를 사용하여 몇 가지 코드를 썼다 :Swift 3.0에서 잠시 후 삽입 경고를하는 방법

let timePerQuestion = 20 
    let timeStartAlert = 10 

    for i in (0..<timeStartAlert) { 
     DispatchQueue.main.asyncAfter(deadline: (.now() + .seconds(timePerQuestion-timeStartAlert+i))) { 
      self.failureLabel.text = "Left \(Int(timeStartAlert-i)) seconds..." 
      self.failureLabel.isHidden = false 
     } 
    } 
    DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(timePerQuestion)) { 
     self.failureLabel.text = "Reseting question" 
     self.failureLabel.isHidden = false 
     self.quiz.skipQuestion() 
     self.playNewRound() 
     self.failureLabel.text = "Sorry, that's not it." 
    } 

그것은 작동하지만, 그 코드는 사용자가 시간에 질문에 대답하는 경우에도 실행합니다. 그래서 사용자가 제때에 응답하면이 코드를 실행하지 못하도록 DispatchQueue.main을 "재설정"하거나 "지울 수"있습니까?

당신이 타이머를 정의 할 필요가 :

+0

그냥 즉, 조건부 넣어 만들 수 있습니다. 'if! userHasAnswered {...}', 블록 내부. – Connor

+0

gcd 인 경우 타이머를 사용하고 사용자가 질문에 대답하면 타이머가 무효화됩니다. –

+0

변수를 사용할 수없는 것처럼 보입니다 (userHasAnswered). 변수가 다른 질문에 대해 달라지기 때문에 (일부 질문은 정시에 응답하고 일부는 건너 뜀). 타이머 사용 방법 – zzheads

답변

0

잘 다음과 같이 NStimer

구현이 클래스에서 scheduled Timer를 사용할 필요가

var timer = Timer()//NStimer()in older versions of swift

timer = scheduledTimer(timeInterval: TimeInterval, invocation: NSInvocation, repeats: Bool)

하는 timeInterval은 기간입니다. 필요한 함수의 실행을 다시 수행하려면 이 실행하려는 함수이고 repeats은 함수가 무효화 될 때까지 함수를 반복 할 것인지를 나타냅니다.

당신은 내가 그것을

0

그것은 이런 종류의 문제에 대한 부울 변수의 배열/사전을 사용하는 것이 좋습니다 도움이되기를 바랍니다 https://developer.apple.com/reference/foundation/timer

에 NS 타이머에 대한 자세한 내용을보실 수 있습니다.

다음 예에서와 같이 배열 또는 사전을 사용할 수 있습니다.

var questionAnswered: [String: Bool] = ["1" : false, "2" : false, "3" : false, "4" : false, "5" : false] 

여기서, Key = question idValue = a boolean indicating whether it is answered. 사용자가 특정 질문에 대답했는지 여부에 따라 업데이트 할 수 있습니다. 그런 다음, 다음과 같은 방법으로 코드에서 사용할 수 있습니다 :

DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(timePerQuestion)) { 
    if let answered: Bool = self.questionAnswered[questionID] { 
     if !answered { 
      DispatchQueue.main.async { 
      self.failureLabel.text = "Reseting question" 
      self.failureLabel.isHidden = false 
      self.quiz.skipQuestion() 
      self.playNewRound() 
      self.failureLabel.text = "Sorry, that's not it." 
      } 
     } 
    } 
} 

가 자유롭게 수정 사항을 제안하는 것이 더 나은 :)