티스토리 뷰
안녕하세요 :) 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
Timer Tolerance
Scheduling Timers in Run Loops
- 타이머를 만들고, 기본 모드의 run loop에서 예약하려면
scheduled
Timer(time 또는Interval: invocation: repeats:) scheduled
Timer(time 클래스 메소드를 사용하세요.Interval: target: selector: user Info: repeats:) - run loop에서 예약하지 않고, 타이머 객체를 만드려면
init(time
또는Interval: invocation: repeats:) init(time
Interval: 클래스 메소드를 사용하세요. (생성 한 후, 해당 run loop객체의target: selector: user Info: repeats:) add(_:
for 메소드를 호출하여 수동으로 run loop에 반드시 타이머를 추가해야합니다.)Mode:) - 타이머를 할당하고
init(fire
At: 메소드를 사용하여 타이머를 초기화하세요.interval: target: selector: user Info: repeats:) (역시나 생성 한 후, 해당 run loop객체의
add(_:
for 메소드를 호출하여 수동으로 run loop에 반드시 타이머를 추가해야합니다.)Mode:)
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
'iOS' 카테고리의 다른 글
iOS ) Text Input Traits (3) | 2018.12.10 |
---|---|
iOS ) Advanced Text Layouts and Effects with Text Kit (1) | 2018.12.01 |
iOS ) animateKeyframes, addKeyframe사용해보기 (0) | 2018.11.23 |
iOS ) PhotoKit (2) - 미디어 가져오기 (13) | 2018.11.09 |
iOS ) PhotoKit - PHImageManager/PHCachingImageManager (0) | 2018.11.03 |
- ios 13
- WKWebView
- 회고
- UIBezierPath
- IOS
- Git
- swift array
- actor
- swift delegate
- WWDC
- SwiftUI
- Accessibility
- Swift
- 피아노
- fastlane
- github
- iOS delegate
- Combine
- swift 공부
- WidgetKit
- swift tutorial
- 스위프트
- 제이슨 파싱
- np-complete
- swift3
- Xcode
- np-hard
- 스위프트 문법
- FLUTTER
- swift sort
- Total
- Today
- Yesterday