Performing selector at beginning / end of run loop

前端 未结 1 1241
余生分开走
余生分开走 2021-02-14 12:41

All events and methods in iOS are processed using NSRunLoop: user events, method calls, rotations, timers, connections, etc.

My question is

1条回答
  •  日久生厌
    2021-02-14 13:28

    You can create a CFRunLoopObserver which will call a block on loop entry and exit. You use CFRunLoopAddObserver to add your observer to the run loop, and CFRunLoopGetMain to obtain the run loop to add to.

    Here is a rather pointless example using these:

    - (void)applicationDidFinishLaunching:(NSNotification *)aNotification
    {
       CFRunLoopObserverRef observer = CFRunLoopObserverCreateWithHandler(NULL, (kCFRunLoopEntry | kCFRunLoopExit), YES, 0, ^(CFRunLoopObserverRef observer, CFRunLoopActivity activity)
       {
          static unsigned long count = 0;
          NSLog(@"activity %lu: %@", ++count, (activity & kCFRunLoopEntry ? @"Enter" : @"Exit"));
       });
       CFRunLoopAddObserver(CFRunLoopGetMain(), observer, kCFRunLoopCommonModes);
    }
    

    This simply installs an observer which logs every entry & exit to the run loop. You can run it as a complete application in Xcode and see how many times the run loop goes around.

    Note that CFRunLoopObserverCreateWithHandler returns a reference you own, if you remove the observer you are responsible for deallocation.

    0 讨论(0)
提交回复
热议问题