2013-03-05 4 views
1

정기적 인 간격으로 NSTimer 나 스레드를 사용하여 함수를 호출 할 수 있습니다. 두 가지 접근 방식은 본질적으로 같은 동작합니다 :일정한 간격으로 메서드를 호출하려면 어떤 방법을 사용해야합니까?

 timer = [ NSTimer 
       scheduledTimerWithTimeInterval:1 
       target:self 
       selector:@selector(doSomething) 
       userInfo:nil 
       repeats:NO 
       ]; 

및 타이머를 사용

@autoreleasepool { 
     BOOL continueProcessingQueue = YES; 
     while (continueProcessingQueue) { 
      [self performSelectorOnMainThread:@selector(doSomething) withObject:nil waitUntilDone:NO]; 
      NSDate *curtainTime = [[NSDate alloc] initWithTimeIntervalSinceNow:10]; 
      NSDate *currentTime = [[NSDate alloc] init]; 

      while (continueProcessingQueue && ([currentTime compare:curtainTime] != NSOrderedDescending)) { 
       if ([self.processThread isCancelled] == YES) { 
        continueProcessingQueue = NO; 
       } 
       [NSThread sleepForTimeInterval:1]; 
       currentTime = [[NSDate alloc] init]; 
      } 
     } 
    } 

훨씬 간단 보인다. 두 번째 접근법이 타이머를 사용하는 것이 더 바람직한 상황이 있습니까?

답변

0

a) 보조 스레드의 활성 상태를 추적하지 않는 경우. 스레드가 종료되면 타이머가 함께 작동하므로 타이머가 예상 한 모든 메시지를 전달하지 못할 수 있습니다.

b) 작업자 스레드가 실제로 실행 루프 (긴 태스크)를 폴링하지 않을 때 및/또는 보조 스레드의 작업이 자주 실행 루프로 제어를 반환하고 게시 할 마일스톤/진행률의 더 높은 정확성이 필요할 때 다른 스레드. 보조 스레드가 유휴 상태이거나 대기 상태 인 경우 대부분 큰 문제는 아닙니다.

실제로 대부분의 시나리오에서 위의 두 방법 중 하나를 사용해서는 안됩니다.

+0

몇 가지를 이해하는 데 어려움이 있습니다. 보조 스레드로 무엇을 언급합니까? 타이머가 시작된 스레드? 지금 논의중인 예제에서 실행 루프를 폴링하면 무엇을 의미합니까? 마지막 : 어느 시나리오도 대부분의 시나리오에서 적절하지 않다고 제안합니다. 내 doSomething이 동기식 POST를 수행하고 있으며 이러한 작업을 수행 할 빈도가 1 분 정도라고 가정하면 위의 두 가지 경우 모두 좋은 접근 방법이 될 것입니다. 현재 백그라운드에서 실행되는 타이머를 허용하는 dispatch_async 문에서 타이머 접근 방식을 사용하고 있습니다. – Lolo

+0

@ user91208 a) 위에서 제공 한 프로그램의 보조 스레드는 작업을 수행하고 주 스레드를 주기적으로 다시 호출합니다. b) 실행 루프 대기/실행. 실행 루프는 스레드의 작업이 수행되고 제어가 리턴 된 후 대기 한 다음에 일어나서 더 많은 작업을 수행합니다 (또는 종료 할 수 있음). 따라서 '투표'보다는 '달리기'가 더 나은 단어 선택입니다. 하지만 '달리다'는 "일할 때까지 유휴 상태"라는 뜻입니다. 모든 코코아 수준의 스레드에는 실행 루프가 있습니다. 실행 루프는 타이머가 연결되는 루프입니다. – justin

+0

@ user91208 c) 설명하는 시나리오에서 NSURLConnectionDelegate를 채택하여 * 비동기 * NSURLConnection을 만듭니다. 물론 중복 작업을 피하기 위해 한 번에 하나씩 만 만들 수 있습니다. 진행/정보가 대리인에게 반환됩니다. – justin

관련 문제