iOS 의 몇 가지 타이머 구현 소결
하지만 iOS 에 서 는 이상 의 임 무 를 수행 하 는 방법 이 많 습 니 다.도대체 몇 가지 방법 이 있 을까요?자 료 를 조회 한 결과 NSTimer,CAdisplayLink,GCD 등 세 가지 방법 이 있 습 니 다.이어서 나 는 그것들의 용법 을 하나하나 소개 할 것 이다.
1.NSTimer
1.생 성 방법
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(action:) userInfo:nil repeats:NO];
2.석방 방법
[timer invalidate];
주의:생 성 방법 을 호출 하면 target 대상 의 계수 기 는 1 을 추가 하여 실행 이 끝 날 때 까지 자동 으로 1 을 줄 입 니 다.순환 실행 이 라면 수 동 으로 닫 아야 합 니 다.그렇지 않 으 면 석방 방법 을 실행 하지 않 아 도 됩 니 다.
3.특성
존재 지연
일회 성 이 든 주기 적 인 timer 의 실제 트리거 이벤트 시간 이 든 모두 추 가 된 RunLoop 과 RunLoop Mode 와 관련 이 있 습 니 다.만약 에 이 RunLoop 이 연속 적 인 연산 을 수행 하고 있다 면 timer 는 지연 되 어 출발 합 니 다.반복 적 인 timer 는 이러한 상황 에 부 딪 히 면 지연 이 한 주 기 를 초과 하면 지연 이 끝 난 후에 바로 실행 되 고 이전에 지정 한 주기 에 따라 계속 실 행 됩 니 다.
Runloop 가입 해 야 합 니 다.
위의 생 성 방식 을 사용 하면 timer 를 MainRunloop 의 NSDefault RunLoopMode 에 자동 으로 추가 합 니 다.다음 방식 으로 타 이 머 를 만 들 려 면 Runloop 에 수 동 으로 가입 해 야 합 니 다.
NSTimer *timer = [NSTimer timerWithTimeInterval:5 target:self selector:@selector(timerAction) userInfo:nil repeats:YES];
[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
2.CAdisplayLink1.생 성 방법
self.displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(handleDisplayLink:)];
[self.displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
2.정지 방법
[self.displayLink invalidate];
self.displayLink = nil;
**캐 디 스 플레이 링크 대상 을 runloop 에 추가 하면 selector 가 주기 적 으로 호출 되 고 중 복 된 NSTimer 와 유사 하 게 시 작 됩 니 다.invalidate 작업 을 수행 할 때 CAdisplayLink 대상 은 runloop 에서 제거 되 고 selector 호출 도 중단 되 며 NSTimer 와 유사 한 invalidate 방법 입 니 다.**3.특성
화면 리 셋 시 캐 디 스 플레이 링크 를 호출 하 는 것 은 화면 리 셋 률 과 동기 화 되 는 주파수 로 특정한 내용 을 화면 에 그 릴 수 있 는 타이머 클래스 입 니 다.CAdisplayLink 가 특정 모드 로 runloop 에 등록 되면 화면 표시 내용 새로 고침 이 끝 날 때마다 runloop 은 CAdisplayLink 가 지정 한 target 에 지정 한 selector 메 시 지 를 보 내 고 CAdisplayLink 류 에 대응 하 는 selector 가 한 번 호출 됩 니 다.그래서 보통 iOS 기기 화면의 주사 율 에 따라 60 회/초
늦추다
4.567917.iOS 기기 의 화면 새로 고침 빈 도 는 고정 되 어 있 고 CAdisplayLink 는 정상 적 인 상황 에서 매번 새로 고침 이 끝 날 때마다 호출 되 며 정확도 가 상당히 높다.그러나 호출 방법 이 비교적 오래 걸 리 면 화면 리 셋 주 기 를 초과 하면 몇 번 의 리 셋 호출 기 회 를 뛰 어 넘 을 수 있 습 니 다
4.중요 속성
한 번 실행 하 다
double delayInSeconds = 2.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
//
});
반복 실행
NSTimeInterval period = 1.0; //
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_source_t _timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
dispatch_source_set_timer(_timer, dispatch_walltime(NULL, 0), period * NSEC_PER_SEC, 0); //
dispatch_source_set_event_handler(_timer, ^{
//
});
dispatch_resume(_timer);
GCD 방식 으로 저 는 인터넷 에서 이 자료 들 만 찾 을 수 있 습 니 다.아직 공부 중 입 니 다.나중에 업데이트 하 겠 습 니 다.iOS 의 몇 가지 타이머 구현 소결 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 iOS 타이머 내용 은 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 도 많은 응원 부 탁 드 리 겠 습 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
View의 레이아웃 방법을 AutoLayout에서 따뜻한 손 계산으로 하면 성능이 9.26배로 된 이야기이 기사는 의 15 일째 기사입니다. 어제는 에서 이었습니다. 손 계산을 권하는 의도는 없고, 특수한 상황하에서 계측한 내용입니다 화면 높이의 10 배 정도의 contentView가있는 UIScrollView 레이아...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.