2011-02-11 2 views
1

간단한 UI가 있다고 가정하고 어떤 이유로 든 5 초마다 UILabel을 업데이트해야합니다.NSTimer 대 별도의 스레드 - 어느 것을 선택해야합니까?

이제는 작업을 수행하는 NSTimer를 설정하거나 끝없이 실행되는 별도의 스레드를 만들 수 있습니다. 5 초간 휴면 상태 일 수도 있고, 다시 잠잘 수도 있습니다.

어느 쪽을 선택하겠습니까? 차이점은 무엇입니까?

답변

1

어쨌든 메인 스레드에서 UI 작업을 수행해야하므로 레이블을 설정하기 전에 일부 처리를 수행하지 않으면 다른 스레드를 사용할 수있는 이점이 없습니다.

+0

NSTimer 콜백에서 "주 스레드에서 호출"할 필요는 없지만 별도의 스레드에서 호출해야합니다. 그러나 레이블 값을 계산하는 데 시간이 걸리면 NSTimer 솔루션이 코드 실행을 중단하고 UI가 느려지 게 만듭니다. 그러면 스레드가 더 나은 옵션이 될 것입니다. 옳은? – Krumelur

+0

NStimer를 사용하면 이미 메인 스레드에있게됩니다. 그렇지만 라벨 계산에 대한 귀하의 권리. 개인적으로 타이머를 사용하여 블록을 사용합니다. –

+0

+1 좋은 설명. – Krumelur

1

UI는 모든 프로그램의 주 스레드에서만 업데이트 할 수 있습니다. 별도의 스레드에서 레이블에 대한 계산을 수행하려는 경우에는 문제가 없지만 UI를 업데이트하는 코드는 주 스레드에서 작동해야합니다 (또는 performSelectorOnMainThread:withObject:waitUntilDone:을 사용하여 레이블에 setText:을 호출하고 작동하게 할 수 있습니다 바르게).

1

NSTimer을 사용하십시오.

왜?

  1. 추가 스레드를 도입하자마자 완전히 새로운 클래스의 버그, 즉 스레드 동기화 문제가 발생할 가능성이 있습니다. 이들은 불확실한 특성으로 인해 진단하고 해결하기가 매우 어려워집니다.
  2. 어쨌든 메인 스레드에서 UI 업데이트를해야합니다. 따라서 UI를 업데이트하려면 스레드가 -performSelectorOnMainThread:withObject:waitUntilDone:이어야합니다. 라벨에 대한 계산은 잠시 (다만 그것을 시도 먼저 간단한 방법 및보고, 그들이 가정하지 않는다)를 가지고가는 경우에

, NSOperation 떨어져 당신의 타이머 킥이 NSOperations이 다음 계산을하고있다 완료되면 -performSelectorOnMainThread:withObject:waitUntilDone:으로 전화하십시오.

관련 문제