기본적으로이 타이머는 키 이벤트를 받으면 반복되어야하며 사용자가 키를 놓으면 무효화됩니다. 그러나 NSRunLoop에서 addTimer:forMode:
을 호출하여 타이머를 "검증"할 수는 없습니다. 왜 이런 일이 일어나고 어떻게 해결할 수 있는지 아는 사람이 있습니까? 감사.NSTimer를 무효화 한 후 "유효성 검사"하는 방법은 무엇입니까?
답변
무효 타이머를 사용할 수 없습니다. 애플 문서에서
:
실행 루프에 예정 일단은, 지정된 간격으로 타이머 화재는이를 무효화 될 때까지. 비 반복 타이머는 발생 즉시 자체를 무효화합니다. 그러나 반복 타이머의 경우 은 무효화 된 메서드를 호출하여 타이머 개체를 직접 무효화해야합니다. 이 메서드를 호출하면 현재 실행 루프에서 타이머가 제거되도록 요청합니다. 결과적으로 타이머가 설치된 동일한 스레드에서 항상 무효화 된 메서드를 호출해야합니다. 타이머를 무 효화하면 더 이상 이 실행 루프에 영향을 미치지 않도록 타이머가 즉시 비활성화됩니다. 그런 다음 실행 루프는 타이머를 제거하고 해제합니다.이 타이머는 invalidate 메서드가 반환되기 직전에 수행되거나 나중에 시점에 해제됩니다. 일단 무효화되면, 타이머 오브젝트는 재사용 될 수 없습니다.
일단 NSTimer를 무효화했다면 다시 사용하지 마십시오.
대신 새 타이머 인스턴스를 만들고 해당 인스턴스를 사용하여 NSRunLoop의 addTimer 메서드에 추가하십시오. 개인적으로 NSTimer의 scheduledTimerWithTimeInterval을 호출하는 것은 한 번에 모든 것을 수행하기 때문에 선호합니다. NSTimer docs에서
:
이 방법은 현재 실행 루프에서 타이머의 제거를 요청 호출; 결과적으로 타이머가 설치된 동일한 스레드에서 항상 무효화 메서드 을 호출해야합니다. 을 무 효화하면 타이머가 즉시 비활성화되어 실행중인 루프에 더 이상 영향을 미치지 않습니다. 그런 다음 실행 루프는 타이머를 제거하고 해제합니다. 무효화 메서드가 반환되기 전에 또는 나중에 해당 시점에 중 하나만 나타납니다. 이 무효화되면 타이머 개체를 다시 사용할 수 없습니다.
맞아요. 나는 그걸 알지 못했습니다 ... 감사합니다! – TheAmateurProgrammer
흥미롭게도 NSRunLoop addTimer가 있지만 타이머를 중지하지 않고 타이머를 중지하지 않으면 유용 할 수있는 removeTimer가 없습니다. 그것은 타이머의 생성은 사과가 그 API를 추가하는 것을 괴롭히지 않도록 포트 생성보다 저렴해야합니다. –