2016-08-22 3 views
1

sleep (1)을 사용할 때, 내 앱은 1 초가 아닌 전체 루프를 잠자 게됩니다. 90 초 후. 레이블은 매 초 대신 업데이트됩니다.신속하게 sleep을 사용하는 방법 2.2

코드 :

while time < 90 { 
     let goal = Int(arc4random_uniform(MAX) + MIN) 

     if goal < 5 { 
      scoreA = scoreA + 1 
     } else if goal > 15 { 
      scoreB = scoreB + 1 
     } 

     time = time + 1 
     scoreLabel.text = "\(scoreA) - \(scoreB)" 
     timeLabel.text = "\(time) min." 
     sleep(1) 
    } 
+0

당신이하지 말아야 할 백그라운드 스레드에서 레이블을 업데이트하는 것처럼 들립니다. – Codo

+0

@ 코도 왜 그 사람이 그렇게 생각하니? – pedrouan

+0

이런 종류의 이상한 지연을 본 적이 있습니다. 문제를 디버깅 할 때 UI 업데이트 코드가 백그라운드 스레드 (내 측면의 감독)에서 실행되고 있음을 발견했습니다. – Codo

답변

1

나는이 경우 NSTimer이 더 적합 생각합니다.

let timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: #selector(MyClass.update), userInfo: nil, repeats: true) 
2

@arsen의 답변에 동의하지만이 문제가 발생하는 이유에 대해 대답하겠습니다.

UILabel의 텍스트를 설정하면 코드가 주 스레드에서 실행 중임을 나타냅니다. while 루프의 모든 롤에서 sleep()으로 전화를 걸면이 경우 메인 스레드를 90 초 동안 차단합니다. 주 스레드가 차단되는 동안 UI가 응답하지 않게됩니다.

주 스레드의 코드가 가능한 빨리 실행되고 종료되므로 UI가 가능한 신속하고 유동적으로 유지되는 것이 좋습니다.

관련 문제