2016-06-09 2 views
-1

주기적으로 시작한 작업 (토큰 새로 고침)을 위해 내 앱에서 하나의 타이머 전에 사용했습니다. 나는 stackoverflow에 코드 예제를 발견하고 그것은 나를 위해 일했습니다.grand-central-dispatch를 통해 2 개의 다른 타이머를 사용하는 것이 왜 효과가 없습니까?

dispatch_source_t _timer; 
static double SECONDS_TO_FIRE = 60.000f; 

다음 방법은 예컨대있다 :

dispatch_source_t CreateDispatchTimer(double interval, dispatch_queue_t queue, dispatch_block_t block) 
{ 
    dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue); 
    if (timer) 
    { 
     dispatch_source_set_timer(timer, dispatch_time(DISPATCH_TIME_NOW, interval * NSEC_PER_SEC), interval * NSEC_PER_SEC, (1ull * NSEC_PER_SEC)/10); 
     dispatch_source_set_event_handler(timer, block); 
     dispatch_resume(timer); 
    } 
    return timer; 
} 

이 변수 정의이다

는 (구현 헤더 위) 코드 예시적인 정의이다
- (void)startTimer { 
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 
    _timer = CreateDispatchTimer(SECONDS_TO_FIRE, queue, ^{ 

     // NSLog(@"timer is fired"); 
     // do smth I need 

     } 
    }); 
} 

그래서이 코드가 매우 잘 나를 위해 일한 :이 타이머를 시작 startTimer.

이제 별도의 작업을 위해 자체 시간 간격으로 실행해야하는 다른 (두 번째) 타이머가 필요합니다.

위의 코드를 별도의 클래스에 복사 했으므로 다른 시간 간격을 설정하십시오. 위의 과 같은 이름을 사용하면 위의 CreateDispatchTimer과 같이 동일한 이름을 사용하면 응용 프로그램이 컴파일되지 않습니다.

그래서 다른 클래스의 두 번째 타이머의 경우 과 같은 dispatch_source_t 이름을 다른 것으로 변경했습니다. 그래서 앱이 성공적으로 컴파일되었습니다.

하지만 문제는 - 두 번째 타이머 만 작동합니다! 처음으로 전혀 해고되지 않습니다!

해결 방법? 마지막 타이머 만 해고 된 이유를 이제 이해할 수 있습니다.

+0

두 번째 디스패치 타이머에 대한 'timer'이름도 변경된 것 같습니다. 그런 다음 작동합니다. 지금 테스트 중입니다. –

+0

당신은'NSTimer'를 사용하지 않는 (좋은) 이유가 있습니까? – Wain

+0

그것은 나를 위해 작동하지 않았다. 그래서 나는 작업 코드를 발견 할 때 GCD를 사용하기 시작했다. –

답변

0

이유를 찾았습니다. 블록 이름을 바꾸는 것을 제외하고는 timer 두 번째 타이머의 이름을 바꿔야했습니다.

첫 번째 타이머가 두 번째 타이머에 의해 완전히 덮어 쓰여졌습니다 (나중에 만들어 짐). 따라서 첫 번째 타이머는 전혀 작동하지 않았습니다.

그래서 초 타이머의 작동 코드 예제는 다음입니다 :

dispatch_source_t CreateLocationTimerDispatch(double interval, dispatch_queue_t queue, dispatch_block_t block) { 
    dispatch_source_t timerForLocationRefresh = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue); 
    if (timerForLocationRefresh) { 
     dispatch_source_set_timer(timerForLocationRefresh, dispatch_time(DISPATCH_TIME_NOW, interval * NSEC_PER_SEC), interval * NSEC_PER_SEC, (1ull * NSEC_PER_SEC)/10); 
     dispatch_source_set_event_handler(timerForLocationRefresh, block); 
     dispatch_resume(timerForLocationRefresh); 
    } 
    return timerForLocationRefresh; 
} 

변수 :

dispatch_source_t _timerForLocationRefresh; 
static double SECONDS_TO_FIRE = 1800.f; // time interval lengh in seconds 1800 

전화 :

- (void)startTimer { 
    // second timer 
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 
    _timerForLocationRefresh = CreateLocationTimerDispatch(SECONDS_TO_FIRE, queue, ^{ 

     // do smth 
    }); 
} 

요약 :

    ,
  • CreateDispatchTimer 두 번째 타이머의 블록 이름을 바꿔야합니다. >CreateLocationTimerDispatch
  • timer 또한 두 번째 타이머의 변수 이름도 변경해야합니다. >timerForLocationRefresh