Runloop 모드

2300 단어
2018-05-24 iOS 프로그램의 입구는main 함수이다.main 함수에서 int a = UIAPplicationMain 이전의 코드는 실행할 수 있지만 그 뒤의 코드는 실행할 수 없다.UIApplicationMain에 사순환(Runloop 순환)이 켜져 있기 때문이다.
보람
  • 현재 라인의 생명을 유지한다.
  • 이벤트 수신: 터치, 클록, 네트워크, UI 등!
  • - (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
  • UI 모드 UITracking RunLoopMode
  • 앞에서 timer를 Runloop에 추가할 때 전달되는 매개 변수는 NSDefaultRunLoopMode는 timer에서 발생하는 이벤트를 Runloop이 기본 모드에서만 감청하는 이벤트로 표시하는 것과 같고 UIScrollView를 미끄러질 때 Runloop의 UI 모드에서 발생하는 Source는 이벤트를 발생시킨다. UI 모드의 우선순위가 높기 때문이다.Runloop은 UI 모드로 전환됩니다. (즉, 기본 모드의 timer와 UI 모드의 Source가 동시에 이벤트가 발생하면 후자를 감청합니다.) 이때otherMethod 방법은 실행되지 않습니다.
    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의 두 모델의 조합에 해당한다.

    좋은 웹페이지 즐겨찾기