주기적으로 시작한 작업 (토큰 새로 고침)을 위해 내 앱에서 하나의 타이머 전에 사용했습니다. 나는 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
이름을 다른 것으로 변경했습니다. 그래서 앱이 성공적으로 컴파일되었습니다.
하지만 문제는 - 두 번째 타이머 만 작동합니다! 처음으로 전혀 해고되지 않습니다!
해결 방법? 마지막 타이머 만 해고 된 이유를 이제 이해할 수 있습니다.
두 번째 디스패치 타이머에 대한 'timer'이름도 변경된 것 같습니다. 그런 다음 작동합니다. 지금 테스트 중입니다. –
당신은'NSTimer'를 사용하지 않는 (좋은) 이유가 있습니까? – Wain
그것은 나를 위해 작동하지 않았다. 그래서 나는 작업 코드를 발견 할 때 GCD를 사용하기 시작했다. –