[Swift/코드한줄] Timer.invalidate()

코드 한 줄에 대해 기록합니다. 의식의 흐름을 따라갑니다.


 

Timer에서 invalidate() 함수의 정의를 보면

타이머를 중지하고 loop에서 제거해주는 역할을 하는 함수

이라고 작성되어있다

지정된 타이머를 제거하는 유일한 방법이라고 한다

(참고로 timer = nil 한다고 이미 시작된 타이머가 초기화되진 않는다...^^ 하하)

 

근데 invalidate() 함수를 작성했는데도 타이머가 계속 진행되는 문제가 발생해서

왜일지 알아보았다

 

만약 timer.invalidate()를 실행했는데도 불구하고 타이머가 계속 실행이 된다면 두 가지 중 이유가 있을 텐데

 

1. 타이머가 중복돼서 실행된 경우

만약 타이머를 설정하는 코드가 2번 실행됐다면 timer.invalidate() 한다고 해서 2번이 모두 취소가 되는 게 아니라 1번만 취소가 되는 구조였다..!

그러니깐 꼭 중복돼서 코드가 실행되지 않는지 확인해봐야 한다

 

2. 타이머의 실행과 취소가 서로 다른 스레드 일 경우

이 경우가 제일 많을 것 같은데, 공식 문서를 보면 꼭 타이머를 설치한 스레드와 같은 스레드에서 보내야 한다고 쓰여있는 것을 확인했다

그렇기 때문에 1번의 이유도 아닌데 취소가 안된다고 하면 print(”\(Thread.current.threadName)”) 로 스레드를 확인해보는 것을 추천한다!

 

따봉 공식 문서야 고마워

2022년 4월 7일 코드한줄🍎 끗 -_-

 

Apple Developer Documentation

 

developer.apple.com