iOS 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할 수 있습니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
IOS RunLoop 의 이벤트 순환 메커니즘 분석Timer/Source 0 이 벤트 를 처리 하 겠 다 는 알림 을 보 냅 니 다. Source 1 이 처리 하지 않 으 면 스 레 드 는 휴면 하고 관찰자 에 게 알림 을 보 냅 니 다. 실제로 RunLoop 은 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.