Runloop 모드
보람
- (void)viewDidLoad {
[super viewDidLoad];
NSTimer * timer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(otherMethod) userInfo:nil repeats:YES];
}
-(void)otherMethod{
NSLog(@"OtherMethod --- %@",[NSThread currentThread]);
}
이상의otherMethod 방법은 실행되지 않으며 timer가 방출되었습니다.viewDidLoad 뒤에 아래 코드를 추가하면 증명할 수 있습니다.
__weak typeof(timer) aaaaa = timer;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
if (aaaaa == nil) {
NSLog(@" ");
}
});
그럼 어떻게 해결해야 하나요?런루프에 timer를 추가하고 다음 코드를 추가합니다
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
실행 후 otherMethod가 실행되고 timer도 풀리지 않습니다.위에서 말한 Runloop은 UI 이벤트를 감청합니다. 만약 app에 UIScrollView를 추가하고 실행한 후에 굴리면 otherMethod 방법이 호출을 멈추고 굴러가지 않으면 복구됩니다.왜 그런 걸까요?
Runloop이 모든 사건을 감청하는 것은 모델로 나뉜다. 내 이해는 Runloop이 처리하는 사건을 분류하고 Runloop이 한 모델에 있으면 대응하는 유형의 사건을 처리한다는 것이다.
NSDefaultRunLoopMode를 UITrackingRunLoopMode로 변경하고 UIScrollView를 터치하고 미끄러뜨리면otherMethod 방법이 실행되기 시작했고 손을 놓은 후에 실행을 멈추는 것을 발견할 수 있습니다. UI 모드는 터치 이벤트에만 촉발되기 때문입니다.
Timer 이벤트를 드래그할 수 있는지 없는지 모두 처리할 수 있도록
[[NSRunLoop currentRunLoop] addTimer:timer forMode:UITrackingRunLoopMode];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
Timer를 두 가지 모드에 각각 추가하지만 애플은 아래로 내려가는 방법이 더 좋다.
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
NSRunLoopCommonModes는 점유 모드로 NSDefaultRunLoopMode와 UITrackingRunLoopMode의 두 모델의 조합에 해당한다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.