DispatchTime과 DispatchWallTime
asyncAfter를 사용하다가 DispatchWallTime이라는 타입에 대해 알게 되었습니다.
제가 평소 사용하던 타입은 DispatchTime이었는데요.
DispatchWallTime 타입도 있길래 써봤더니
똑같이 동작을 하더라고요?? 메서드 설명도 똑같고...
그래서 공식 문서에서 타입을 직접 검색해서 차이점을 비교해보았습니다.
공식 문서 살펴보기
일단 asyncAfter의 설명부터 보겠습니다.
타입이 다르니 설명도 다르지 않을까? 하는 기대감에 봤는데요.
Overview
asyncAfter deadline에는 execution "at" the specified time 이라고 나와 있고
asyncAfter wallDeadline에는 execution "after" the specified time 이라고 나와있네요.
일단 파파고 번역으로는 차이점을 모르겠구요..
Parameters
Deadline은 파라미터명이 deadline이고,
wallDeadline은 파라미터명이 wallDeadline 이네요.
파라미터명을 제외하면 내용은 완전히 같습니다.
타입 공식 문서 살펴보기
그래서 타입 문서까지 살펴보았습니다.
솔직히 타입 설명도 똑같을 줄 알았는데 의외로(?) 답을 찾을 수 있었어요.
DispatchTime
DispatchTime은 "relative" to the default clock 입니다.
기본 시계(시스템 시계)를 기준으로 잡은 상대적인 시점입니다.
DispatchQueue.main.asyncAfter(deadline: .now() + 10) {
// 코드
}
여기서는 현재 시점으로부터 10초 뒤에 로직이 수행이 됩니다.
즉, Queue에 들어간 시간을 기준으로 10초 뒤라는 의미에요.
DispatchWallTime
DispatchWallTime의 설명입니다.
Wall-clock에 대한 절대적인 시점을 의미합니다.
wall-clock 이라는 단어와 absolute라는 단어가 핵심 포인트인데요.
wall-clock은 real time과 동의어로 사용되고
시스템 시간을 기준으로 절대적인 시점을 본다는 의미입니다.
DispatchQueue.global().asyncAfter(wallDeadline: .now() + 10) {
// 코드
}
10시 00분 00초에 위 코드를 실행하면
10시 00분 10초에 로직이 수행이 됩니다.
만약 위 두 개의 Task를 Queue에 넣고
시스템 시간을 30초 뒤로 변경했다고 해봅시다!
그러면 Queue에 넣은 뒤 10초 뒤에 수행되는 DispatchTime 코드는 수행이 안 되고,
절대적인 시간을 기준으로 10초 뒤에 수행되는 DispatchWallTime 코드는 수행이 됩니다.
무슨 차이인지 이해가 가시죠!?
이 차이 말고도
DispatchTime은 나노 초의 정밀도를,
DispatchWallTime은 마이크로 초의 정밀도를 가집니다.
1 나노초가 0.001 마이크로초, 1 마이크로초가 100 나노초입니다.
(대충 DispatchTime가 더 정확다는 의미)
참고
https://developer.apple.com/documentation/dispatch/dispatchqueue/2300020-asyncafter
https://developer.apple.com/documentation/dispatch/dispatchqueue/2300053-asyncafter
https://developer.apple.com/documentation/dispatch/dispatchtime
https://developer.apple.com/documentation/dispatch/dispatchwalltime
https://en.wikipedia.org/wiki/Elapsed_real_time
아직은 초보 개발자입니다.
더 효율적인 코드 훈수 환영합니다!
공감과 댓글 부탁드립니다.