iOS 의 몇 가지 타이머 구현 소결

4246 단어 iOS타이머
소프트웨어 개발 과정 에서 우 리 는 특정한 시간 후에 특정한 방법 을 집행 하거나 특정한 주기 에 따라 특정한 방법 을 계속 집행 해 야 한다.이 럴 때 우 리 는 타 이 머 를 사용 해 야 한다.
하지만 iOS 에 서 는 이상 의 임 무 를 수행 하 는 방법 이 많 습 니 다.도대체 몇 가지 방법 이 있 을까요?자 료 를 조회 한 결과 NSTimer,CAdisplayLink,GCD 등 세 가지 방법 이 있 습 니 다.이어서 나 는 그것들의 용법 을 하나하나 소개 할 것 이다.
1.NSTimer
1.생 성 방법

NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(action:) userInfo:nil repeats:NO];
  • TimerInterval  : 실행 하기 전에 기다 린 시간.예 를 들 어 1.0 으로 설정 하면 1 초 후에 실행 하 는 방법 을 나타 낸다
  • target  : 실행 방법 이 필요 한 대상.
  • selector  : 실행 해 야 할 방법
  • repeats  : 순환 이 필요 합 니까?
    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.CAdisplayLink
    1.생 성 방법
    
    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 는 정상 적 인 상황 에서 매번 새로 고침 이 끝 날 때마다 호출 되 며 정확도 가 상당히 높다.그러나 호출 방법 이 비교적 오래 걸 리 면 화면 리 셋 주 기 를 초과 하면 몇 번 의 리 셋 호출 기 회 를 뛰 어 넘 을 수 있 습 니 다
  • 만약 에 CPU 가 너무 바 빠 서 화면 60 회/초의 주사 율 을 보장 하지 못 하면 여러 번 호출 방법 을 건 너 뛰 는 기 회 를 초래 할 수 있 고 건 너 뛰 는 횟수 는 CPU 의 바 쁜 정도 에 달 려 있다
  • 장면 을 사용 하 는 것 은 원리 적 으로 볼 수 있 듯 이 CAdisplayLink 는 인터페이스의 끊 임 없 는 재 구성 에 적합 하 다.예 를 들 어 영상 을 재생 할 때 다음 프레임 을 끊임없이 가 져 와 인터페이스 렌 더 링 에 사용 해 야 한다.
    4.중요 속성
  • frameInterval NSInteger 형식의 값 은 몇 프레임 간격 으로 selector 방법 을 호출 하 는 지 설정 합 니 다.기본 값 은 1 입 니 다.즉,프레임 마다 한 번 씩 호출 합 니 다
  • duration readOnly 의 CFTimeInterval 값 은 두 번 의 화면 새로 고침 사이 의 시간 간격 을 나타 낸다.주의해 야 할 것 은 이 속성 은 target 의 selector 가 처음 호출 된 후에 야 값 을 부여 할 수 있 습 니 다.selector 의 호출 간격 계산 방식 은:호출 간격=duration 입 니 다.× frameInterval。
  • 3.GCD 방식
    한 번 실행 하 다
    
    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 타이머 내용 은 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 도 많은 응원 부 탁 드 리 겠 습 니 다!

    좋은 웹페이지 즐겨찾기