티스토리 뷰

iOS

iOS ) Task Management - Scheduling - Timer

Zedd0202 2018. 11. 30. 14:29
반응형


안녕하세요 :) Zedd입니다.


지금  UndoManager까지 했죠? Progress는 글을 쓰다가, 음.....조금 생각해야 할 게 있어서 잠시....ㅎ

그리고 Operation은 예전에 Operation에 대해서 글을 쓴 적이 있어서 넘어갈게요.

iOS ) Concurrency Programming Guide - Concurrency and Application Design


그래서 Timer글을 쓰게 되었습니다.

하핫



Timer



타이머는 클래스 인데요, 

"특정 시간 각격(time interval)이 지난 후 시작되어 지정된 메세지를 대상 객체로 보내는 타이머 입니다"

가 정의에요. 

타이머는 run loop와 함께 작동하는데요, run loop는 타이머에 대한 strong Reference를 유지하므로, run loop에 추가 한 후, 타이머에 대한 strong reference를 유지 할 필요가 없습니다.


타이머를 효과적으로 사용하려면, run loop가 작동하는 방법을 알아야 합니다.....ㅎ

자세한 내용은  Threading Programming Guide을 참고하세요.


타이머는  real-time mechanism(실시간 매커니즘)이 아닙니다. 장시간 run loop callout중 또는 run loop가 타이머를 모니터링 하지 않는 모드에 있는 경우, run loop가 타이머를 확인 할 때 까지 타이머가 실행되지 않습니다. 따라서 타이머가 실제로 실행되는 시간은 훨씬 늦을 수 있습니다. 

타이머는 Core Foundation의 CFRunLoopTimer와 연결되어 toll-free bridged입니다.


...?? toll-free bridged...???

이게 머지 하고 찾아봤더니

"Core Foundation 프레임워크와 Foundation프레임워크에는, 서로 다른 방식으로 사용 할 수 있는 다양한 데이터 타입이 있습니다. toll-free bridging이라고 하는 이 기능은, Core Foundation 함수 호출에 대한 매개변수나 Objc메세지의 수신사와 동일한 데이터 타입을 사용 할 수 있음을 의미합니다. 

예를들어, NSLocale은 Core Foundation의 CFLocale과 상호 교환 가능합니다 (아하..) 

따라서 NSLocale *파라미터를 보는 메소드에서 CFLocaleRef를 전달 할 수 있으며, CFLocaleRef 매개변수가 있는 함수에 NSLocale인스턴스를 전달 할 수 있습니다."


아 예제를 들어주니까 알겠네요. 

그러니까 저기서 NSLocale이 Timer고 CFLocale가 CFRunLoopTimer이라고 생각하면 되는 거겠죠? 

아하아하


Comparing Repeating and Nonrepeating Timers

타이머가 생성 될 때, repeating(반복) 또는 nonrepeating(비반복) 여부를 지정합니다. nonrepeating 타이머는 한번 실행 된 다음, 자동으로 무효화(invalidates)되므로, 타이머가 다시 실행되지 않습니다. 반대로, repeating 타이머가 작동되면, 동일한 run loop에서 다시 예약됩니다. repeating 타이머는 항상 실제 작동 시작이 아닌, 예약된 작동 시간을 기준으로 자체 스케쥴을 지정합니다. 
예를들어, 타이머가 특정 시간 및 그 이후 5초마다 실행되도록 예약된 경우, 실제 실행 시간이 지연되더라도, 예정된 실행시간은 항상 원래의 5초 시간 간격으로 떨어집니다. 만일 발사 시간이 하나 또는 그 이상의 예정된 발사 시간을 통과하도록 지연시킨다면, 타이머는 그 시간동안 한번만 작동되며, 작동 후에는 다음번 예정된 작동 시간동안 재조정됩니다. 

Timer Tolerance

iOS7 이상 및 macOS 10.9이상에서는 타이머 허용 오차(tolerance)를 지정 할 수 있습니다. 타이머가 작동 할 때의 이러한 유연성 덕분에, 시스템의 전력절감 및 응답성을 최적화 할 수 있습니다. 
타이머는 예정된 작동 날짜와 예정된 작동 날짜에 허용 오차를 더한 시간 사이에 언제든지 작동 할 수 있습니다. 타이머는 예정된 작동 날짜 전에는 작동되지 않습니다. 
repeating 타이머의 경우, 다음 작동 날짜는 drift를 피하기 위해, 개별 작동 시간에 적용되는 허용 오차와 관계없이, 원래 작동 날짜로부터 계산됩니다. 기본값은 0이며 추가적인 허용오차가 적용되지 않음을 의미합니다. 시스템은 허용오차 프로퍼티의 값에 관계없이 특정 타이머에 대해 적은 양의 허용오차를 적용 할 수 있는 권리를 보유하고 있습니다. (헉..)

Scheduling Timers in Run Loops

한번에 하나의 run loop에서만 타이머를 등록 할 수 있지만, run loop내에서 여러 run loop모드에 추가 할 수 있습니다. 
타이머를 생성하는 세가지 방법은 다음과 같습니다.


run loop에서 예약되면, 타이머는 무효화(invalidate) 될 때까지 지정된 interval로 실행됩니다. nonrepeating 타이머는 발동 한 후, 즉시 무효화(invalidate) 됩니다. 그러나 repeating 타이머의 경우, invalidate()메소드를 호출하여 타이머 객체를 직접 무효화 해야합니다. 이 메소드를 호출하면, 현재 run loop에서 타이머를 제거하도록 요청합니다. 따라서, 타이머가 설치?(installed)된 동일한 쓰레드에서 항상 invalidate()메소드를 호출해야합니다. 타이머를 무효화하면 더이상 run loop에 영향을 미치지 않도록 타이머가 즉시 비활성화 되빈다. 그런 다음, run loop는 invalidate()메소드가 반환되기 바로 직전 또는 이후 시점에서 타이머(및 타이머에 대한 strong reference)를 제거합니다. 타이머 객체가 invalidate되면 재사용 할 수 없습니다.


repeating 타이머가 실행 된 후에는 마지막 예약 된 fire date이후의 interval의 정수배에 가장 가까운 미래 날짜에 대해, 지정된 tolerance(허용오차) 내에서 다음 발사(fire)를 예약합니다. (계속 발사라고 하니까 뭔가 이상하네요.....느낌만 오시면 됩니다. fire라고 그냥 번역할 걸 그랬음) 

selector나 invocation을 호출하는데 걸리는 시간이 지정된 interval보다 긴 경우, 타이머는 다음 firing만 예약합니다. 즉, 타이머는 지정된 selector 또는 invocation을 호출한느 동안 발생한 누락된 firing을 보완(compensate)하지 않습니다. 


Subclassing Notes

Timer를 서브클래싱 하지 마세요. 


한 줄 간지.........

악 예전에 써놨던건데 이때까지 발행안하고 모했지...ㅋ-ㅋ
Timer를 써보는 글은 따로 쓸게요 :)
이번주 주말에 꼭!!!!!!!!!! 꼭 TextKit을 공부하는게 목표입니다. 제발 꼭 공부하길


반응형