iOS NSTimer 하위 스레드 생성 및 취소

1. 서브스레드에서 NSTimer 실행
먼저.m 파일에서 두 가지 속성을 설명합니다. 하나는 하위 스레드이고 하나는 하위 스레드의 NSTimer입니다.
@property (nonatomic, strong) NSThread *thread1;

@property (nonatomic, strong) NSTimer *threadTimer;

그런 다음 GCD를 사용하여 글로벌 팀 전체에 하위 스레드를 생성하고 NSTimer를 생성합니다.
  __weak __typeof(self) weakSelf = self;
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        __strong __typeof(weakSelf) strongSelf = weakSelf;
        if (strongSelf) {
            strongSelf.thread1 = [NSThread currentThread];
            [strongSelf.thread1 setName:@"  A"];
            strongSelf.threadTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:strongSelf selector:@selector(timerAction) userInfo:nil repeats:YES];
            NSRunLoop *runloop = [NSRunLoop currentRunLoop];
            [runloop addTimer:strongSelf.threadTimer forMode:NSDefaultRunLoopMode];
            [runloop run];
        }
    });

참고: 하위 스레드에 생성된 NSTimer는 해당 스레드의 RunLoop에 추가되어야 합니다.RunLoop에서 자주 사용하는 모델은 NSDefaultRunLoopMode, UITrackingRunLoopMode와 NSRunLoopCommonModes 세 가지가 있다.
NSDefaultRunLoop 기본 모드
UITracking RunLoop 인터페이스 추적, scrollView 드래그 슬라이딩에 사용
NSRunLoopCommonModes는 특정한 모델이 아니라 표시일 뿐이고 비교적 종합적인 모델(이전 두 가지 모델 포함)
NSTimer에서 RunLoop을 실행하려면 먼저 RunLoop을 실행해야 합니다.
2. 서브스레드에서 NSTimer 종료
다음에 cancelTimer를 만드는 방법
- (void)cancel{

if (self.threadTimer) {

[self.threadTimer invalidate];

self.threadTimer = nil;

}

}

만약 이 방법이 NSTimer를 만드는 것과 같은 라인에서 실행되지 않는다면, Timer를 invalidate 작업으로 실행할 수 없습니다.
그리고 현재 우리는thread1 라인에서 이 동작을 실행해야 합니다. 하위 라인에서 이 방법을 호출하는 데 사용할 방법을 여기에 쓰십시오.
- (void)cancelTimer{

if (self.threadTimer && self.thread1) {

[self performSelector:@selector(cancel) onThread:self.thread1 withObject:nil waitUntilDone:YES];

}

}

마지막으로 Timer를 종료해야 할 지점에서 이 방법을 실행하면 됩니다.
NSTimer가 동일한 스레드에서 생성되고 종료되는 이유에 대해 살펴보겠습니다.생성된 Timer가 이 라인에 대응하는 RunLoop에 추가되었기 때문에, 이 RunLoop은 이 Timer를 하나의 이벤트로 설정했습니다.따라서 같은 라인에서만 이 Timer를 cancel할 수 있습니다.

좋은 웹페이지 즐겨찾기