RunLoopでの使用シーンについて

2099 ワード

  • RunLoopの作成
  • すべてのスレッドのRunLoopは怠惰にロードされていると考えることができ,currentRunLoopを直接使用して現在のスレッドのRunLoopオブジェクトを直接入手することができ,mainThreadで入手できるのはmainRunLoopであり,そのコードはそれぞれ以下の
  • である.
  • メインスレッド
  • [NSRunLoop mainRunLoop];
    CFRunLoopGetMain()

       -     
    

    [NSRunLoop currentRunLoop];
    CFRunLoopGetCurrent();

    - RunLoop Mode
       - Source:      Source0  Source1
           - Source0:   port 
           - Source1:  port ,     ,Source1       Source0  
        - Observer
             RunLoop    Observer:     CFRunLoop   ,OC        API
         ```
    CFRunLoopObserverRef observer = CFRunLoopObserverCreateWithHander(kCFAllocatorDefault,kCFRunLoopAllActivities,YES,0,^(CFRunLoopObserverRef observer,CFRunLoopActivitity activity){
       
       });
          ```
           observier,            RunLoop     ,Block    RunLoop      block
    
    ![Snip20160529_1.png](http://upload-images.jianshu.io/upload_images/2443652-36cd132036fd5aeb.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
               RunLoop          
    
    

    CFRunLoopAddObserver(CFRunLoopGetCurrent(),observer,kCFRunLoopDefaultMode);

           RunLoop        Observer
    
    -              RunLoop
       -    :
             port  RunLoop source      
         ```
        [[NSRunLoop currentRunLoop]addPort:[[NSPort alloc]init]forMode:NSDefaultRunLoopMode];
        [[NSRunLoop currentLoop]run];
    
            ,     run    RunLoop
    -    :
         while(1)        RunLoop,         ,  RunLoop  source    
       ```
       while(1)
      {
           [[NSRunLoop currentLoop]run];
       }
      ```
    
    • RunLoop
      • OC RunLoop , , , C
      //C      RunLoop
       CFRunLoopRun();
       //  
       CFRunLoopStop(self.runLoop);
      
    
      RunLoop                 ,                     ,          
    
      :