이상한 Grand Central Dispatch 타이머 동작에 직면했습니다. 그것은 발사의 시간을 깨고 몇 초 동결됩니다. "온라인"상태로 유지하려면 서버를 핑 (ping)해야하지만이 동작은 적합하지 않습니다.이상한 GCD 타이머 동작
여기 타이머 생성 코드입니다.
// pingTimer and pingQueue are class members
- (void)createPingTimerSource
{
// check timer exists
if(pingTimer)
{
// suspend source and cancel
[self setPingTimerSuspended:YES];
dispatch_source_cancel(pingTimer);
}
// check having queue, create if doesn't exist
if(!pingQueue)
pingQueue = dispatch_queue_create(kDispatchTimerQueueLabel, NULL);
// create timer dispatch source
pingTimer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, pingQueue);
dispatch_source_set_timer(pingTimer, dispatch_time(DISPATCH_TIME_NOW, 5*NSEC_PER_MSEC), 5*NSEC_PER_MSEC, NSEC_PER_SEC/10);
// set event handler
dispatch_source_set_event_handler(pingTimer,^{
printf("[%llu] gcd timer fired.\n", mach_absolute_time()/NSEC_PER_SEC);
dispatch_async(dispatch_get_main_queue(), ^{
[self sendPingToServer];
});
});
// set cancel handler
dispatch_source_set_cancel_handler(pingTimer, ^{
// release dispatch source if exists
if(pingTimer)
dispatch_release(pingTimer);
// check timer queue exists and release if does
if(pingQueue)
dispatch_release(pingQueue);
});
}
여기서 로그 콘솔이 촬영되었습니다.
네가 맞다. 도와 줘서 고마워! – Astoria