随机配图betway体育app:,就是运行循环

[self.imageView performSelectorOnMainThread:@selector(setImage:) withObject:[UIImage imageNamed:@"lnj"] waitUntilDone:YES modes:@[NSDefaultRunLoopMode]];

iOS RunLoop,iosrunloop

  • 什么是RunLoop
    • 运维循环
    • 三个线程对应三个RunLoop,主线程的RunLoop暗中认可已经运营,子线程的RunLoop得手动运行(调用run方法)
    • RunLoop只好选择三个Mode运转,要是当前Mode中并未别的Source(Sources0、Sources1)、Timer,那么就径直退出RunLoop
  • RunLoop作用

    • 维持程序的无休止运维
    • 管理App中的各个风浪(比方触摸事件、电磁照应计时器事件、Selector事件)
    • 节省CPU财富,升高程序质量:该专门的职业时职业,该安家立业时苏息 ......
  • 模拟RunLoop内部贯彻

    • 实际上它个中就是do-while循环,在那个轮回之中不断地管理各类任务(比方Source、Timer、Observer)
    • void message(int num)
      {
          printf("执行第%i个任务", num);
      }
      int main(int argc, const char * argv[]) {
          do {
              printf("有事吗? 没事我睡了");
              int number;
              scanf("%i", &number);
              message(number);
          } while (1);
          return 0;
      }
      

 

  • 获得RunLoop对象

    • RunLoop对象
      • NSRunLoop
      • CFRunLoopRef
    • Foundation

      [NSRunLoop currentRunLoop]; // 获得当前线程的RunLoop对象
      [NSRunLoop mainRunLoop]; // 获得主线程的RunLoop对象
      
    • Core Foundation

      CFRunLoopGetCurrent(); // 获得当前线程的RunLoop对象
      CFRunLoopGetMain(); // 获得主线程的RunLoop对象
      
  • RunLoop结构

  • betway体育app 1

  • CFRunLoopRef对应RunLoop对象

    • CFRunLoopModeRef代表RunLoop的运维方式, 系统私下认可注册了5个Mode
      • NSDefaultRunLoopMode:App的暗中同意Mode,常常主线程是在那个Mode下运作
      • UITrackingRunLoopMode:分界面追踪 Mode,用于 ScrollView 追踪触摸滑动,保险分界面滑动时不受别的 Mode 影响
      • NSRunLoopCommonModes: 那是三个占位用的Mode,不是一种真正的Mode
    • CFRunLoopTimerRef是基于时间的触发器
      • CFRunLoopTimerRef基本上说的就是NSTimer,它受RunLoop的Mode影响
    • CFRunLoopSourceRef是事件源(输入源)
    • CFRunLoopObserverRef是旁观者,能够监听RunLoop的情事改造
    • betway体育app 2
    • // 1.创建Observer

          // 第一个参数:用于分配该observer对象的内存
          // 第二个参数:用以设置该observer所要关注的的事件
          // 第三个参数:用于标识该observer是在第一次进入run loop时执行, 还是每次进入run loop处理时均执行
          // 第四个参数:用于设置该observer的优先级
          // 第五个参数: observer监听到事件时的回调block
          CFRunLoopObserverRef observer = CFRunLoopObserverCreateWithHandler(CFAllocatorGetDefault(), kCFRunLoopAllActivities, YES, 0, ^(CFRunLoopObserverRef observer, CFRunLoopActivity activity) {
              switch(activity)
              {
                  case kCFRunLoopEntry:
                      NSLog(@"即将进入loop");
                      break;
                  case kCFRunLoopBeforeTimers:
                      NSLog(@"即将处理timers");
                      break;
                  case kCFRunLoopBeforeSources:
                      NSLog(@"即将处理sources");
                      break;
                  case kCFRunLoopBeforeWaiting:
                      NSLog(@"即将进入休眠");
                      break;
                  case kCFRunLoopAfterWaiting:
                      NSLog(@"刚从休眠中唤醒");
                      break;
                  case kCFRunLoopExit:
                      NSLog(@"即将退出loop");
                      break;
                  default:
                      break;
              }
          });
      
          // 2.添加监听
          /*
           第一个参数: 给哪个RunLoop添加监听
           第二个参数: 需要添加的Observer对象
           第三个参数: 在哪种模式下监听
           */
          CFRunLoopAddObserver(CFRunLoopGetMain(), observer, kCFRunLoopDefaultMode);
      
          // 3,释放observer
          CFRelease(observer);
      

       

  • RunLoopRunLoop管理逻辑

  • betway体育app 3
  • RunLoopRunLoop应用

    • NSTimer

      • 只能在钦点的model下运作
      • NSTimer *timer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(test) userInfo:nil repeats:YES];
        [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
        
    • ImageView显示

      • 只好在内定的model下设置图片
    • PerformSelector

      • 只可以在钦定的model下调用
      • [self.imageView performSelectorOnMainThread:@selector(setImage:) withObject:[UIImage imageNamed:@"lnj"] waitUntilDone:YES modes:@[NSDefaultRunLoopMode]]; 
    • 常驻线程

      • 必需调用run才会施行死循环
      • NSRunLoop的model中必须有source/timer,死循环才不会脱离
      • NSRunLoop *runloop = [NSRunLoop currentRunLoop];
        [runloop addPort:[NSMachPort port] forMode:NSDefaultRunLoopMode];
        [runloop run]
        
         
    • 自行释放池

      • activities = 0x1 = 1
        1: 即将进入RunLoop : 创建一个自动释放池
        activities = 0xa0 = 160 = 128 + 32
        32:即将休眠 : 释放上一次的自动释放池, 创建一个新的自动释放池
        128:即将退出RunLoop : 释放自动释放池
        

 

 

RunLoop,iosrunloop 什么是RunLoop 运营循环 一个线程对应二个RunLoop,主线程的RunLoop默许已经起步,子线程的RunLoop得手动运营(调用run方法)...

让Crash的应用软件回光返照,接到Crash的Signal后手动重启RunLoop

CFRunLoopRef runloop = CFRunLoopGetCurrent();
NSArray *allModes = CFBridgingRelease(CFRunLoopCopyAllModes(runLoop));
while(1){
for (NSString *mode in allModes){
    CFRunLoopInMode((CFStringRef)mode,0.001,false);
}}
  • 呼吁服务器响应

NSTimer

设置RunLoopMode,让NS提姆er不影响别的刷新,暗中同意境况下NSTimer被投入NSDefalutRunLoopMode

要是不想让NSTimer受到组件大概动画片影响,就增加到NSRunLoopCommonModes:

NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(ddd) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
NSTimer *timer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(test) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
  • 常驻线程
    • 总得调用run才会实践死循环
    • NSRunLoop的model中必得有source/timer,死循环才不会脱离

二个TableView延迟加载图片的新思路

[self.avatarImageView performSelector:@selector(serImage:) withObjetc:downloadedImage afterDelay:0 inModes:@[NSDefaultRunLoopMode]];

+ (NSThread *)networkRequestThread {
    static NSThread *networkRequestThread = nil;
    static dispatch_once_t oncePredicate;
    dispatch_once(&oncePredicate, ^{
        networkRequestThread = [[NSThread alloc] initWithTarget:self selector:@selector(networkRequestThreadEntryPoint:) object:nil];
        [networkRequestThread start];
    });

    return networkRequestThread;
}

.png)

获得RunLoop对象

Foundation

[NSRunLoop currentRunLoop]; // 获得当前线程的RunLoop对象
[NSRunLoop mainRunLoop]; // 获得主线程的RunLoop对象

Core Foundation

CFRunLoopGetCurrent(); // 获得当前线程的RunLoop对象
CFRunLoopGetMain(); // 获得主线程的RunLoop对象

RunLoopRunLoop的应用

  • RunLoop结构
    • CFRunLoopRef对应RunLoop对象
 // 1.创建URL NSURL *url = [NSURL URLWithString:@"http://xxx.jpg"]; // 2.根据URL创建NSURLRequest NSURLRequest *request = [NSURLRequest requestWithURL:url]; // 3.利用NSURLConnection发送请求 /* // 只要调用alloc/initWithRequest, 系统会自动发送请求 [[NSURLConnection alloc] initWithRequest:request delegate:self]; */ /* // startImmediately: 如果传递YES, 系统会自动发送请求; 如果传递NO, 系统不会自动发送请求 NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:NO]; [conn start]; */ [NSURLConnection connectionWithRequest:request delegate:self];

+ 代理方法

#pragma mark - NSURLConnectionDataDelegate/* 只要接收到服务器的响应就会调用 response:响应头 */- connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{ NSLog(@"%s", __func__);}/* 接收到服务器返回的数据时调用(该方法可能调用一次或多次) data: 服务器返回的数据(当前这一次传递给我们的, 并不是总数) */- connection:(NSURLConnection *)connection didReceiveData:data{ NSLog(@"%s", __func__);}/* 接收结束时调用 */- connectionDidFinishLoading:(NSURLConnection *)connection{ NSLog(@"%s", __func__);}/* 请求错误时调用 */- connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{ NSLog(@"%s", __func__);}

活动释放池

activities = 0x1 = 1
1: 即将进入RunLoop : 创建一个自动释放池
activities = 0xa0 = 160 = 128 + 32
32:即将休眠 : 释放上一次的自动释放池, 创建一个新的自动释放池
128:即将退出RunLoop : 释放自动释放池
  • 自行释放池
  • 附:我的github地址

RunLoop内部贯彻

实则它当中正是do-while循环,在那几个轮回之中不断地管理种种职务(比方Source、Timer、Observer)。

void message(int num) {
    printf("执行第%i个任务", num);
}

int main(int argc, const char * argv[]) {
    do {
        printf("有事吗? 没事我睡了");
        int number;
        scanf("%i", &number);
        message(number);
    } while (1);
    return 0;
}

NSRunLoop *runloop = [NSRunLoop currentRunLoop];[runloop addPort:[NSMachPort port] forMode:NSDefaultRunLoopMode];[runloop run]

常驻线程

AFNetWorking 中开创RunLoop,创制三个常驻服务线程的很好的措施

  • 必得调用run才会实行死循环
  • NSRunLoop的model中必得有source/timer,死循环才不会脱离
[[NSThread currentThread] setName:@"AFNetworking"];
NSRunLoop *runloop = [NSRunLoop currentRunLoop];
[runLoop addPort:[NSMachPort port] forMode:NSDefalutRunLoopMode]//一直活着

[runLoop run];
  • RunLoopRunLoop应用
  • NSTimer
    • 只好在内定的model下运作
  • 粤语标题

什么是RunLoop

从字面意思看,正是运营循环,兜圈圈儿。

  • 运行循环
  • 多少个线程对应二个RunLoop,主线程的RunLoop暗中认可已经起步,子线程的RunLoop得手动运维(调用run方法)
  • RunLoop只好选用叁个Mode运维,如果当前Mode中绝非其余Source(Sources0、Sources1)、Timer,那么就径直退出RunLoop。
![](https://upload-images.jianshu.io/upload_images/5132421-c2defe6fda191462.jpg)

这里写图片描述
  • CFRunLoopModeRef代表RunLoop的运行模式, 系统默认注册了5个Mode
    • NSDefaultRunLoopMode:App的暗中认可Mode,经常主线程是在这些Mode下运作
    • UITrackingRunLoopMode:分界面跟踪 Mode,用于 ScrollView 跟踪触摸滑动,保障分界面滑动时不受其余 Mode 影响
    • NSRunLoopCommonModes: 那是二个占位用的Mode,不是一种真正的Mode
  • CFRunLoopTimerRef是根据时间的触发器
    • CFRunLoopTimerRef基本上说的便是NSTimer、CADisplayLink等,它受RunLoop的Mode影响
  • CFRunLoopSourceRef是事件源(输入源)
    • Source是RunLoop的数据源抽象类(protocol)
      • Sourece0:处理App内部事件、App自身肩负管理(触发),如UI伊夫nt
      • Sourece1:由RunLoop和水源管理,Mach port驱动,如CFMachPort等
  • CFRunLoopObserverRef是观看者,能够监听RunLoop的情事退换,框架中有的是机制都都RunLoopObserver触发,如CAAnimation

RunLoop事件队列

历次运维run loop,你线程的run loop对会自行管理以前未管理的消息,并布告相关的观察者。具体的各样如下:

betway体育app 4

RunLoop事件队列



// 1.创建Observer
// 第一个参数:用于分配该observer对象的内存
// 第二个参数:用以设置该observer所要关注的的事件
// 第三个参数:用于标识该observer是在第一次进入run loop时执行, 还是每次进入run loop处理时均执行
// 第四个参数:用于设置该observer的优先级
// 第五个参数: observer监听到事件时的回调block
CFRunLoopObserverRef observer = CFRunLoopObserverCreateWithHandler(CFAllocatorGetDefault(), kCFRunLoopAllActivities, YES, 0, ^(CFRunLoopObserverRef observer, CFRunLoopActivity activity) {
    switch(activity)
    {
        case kCFRunLoopEntry:
            NSLog(@"即将进入loop");
            break;
        case kCFRunLoopBeforeTimers:
            NSLog(@"即将处理timers");
            break;
        case kCFRunLoopBeforeSources:
            NSLog(@"即将处理sources");
            break;
        case kCFRunLoopBeforeWaiting:
            NSLog(@"即将进入休眠");
            break;
        case kCFRunLoopAfterWaiting:
            NSLog(@"刚从休眠中唤醒");
            break;
        case kCFRunLoopExit:
            NSLog(@"即将退出loop");
            break;
        default:
            break;
    }
});

// 2.添加监听
/*
 第一个参数: 给哪个RunLoop添加监听
 第二个参数: 需要添加的Observer对象
 第三个参数: 在哪种模式下监听
 */
CFRunLoopAddObserver(CFRunLoopGetMain(), observer, kCFRunLoopDefaultMode);

// 3,释放observer
CFRelease(observer);
 // 1.创建一个URL NSURL *url = [NSURL URLWithString:@"http://129.168.1.1:31812/login"]; // 2.根据URL创建NSURLRequest对象 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; // 2.1设置请求方式 // 注意: POST一定要大写 request.HTTPMethod = @"POST"; // 2.2设置请求体 // 注意: 如果是给POST请求传递参数: 那么不需要写?号 request.HTTPBody = [@"username=cyx&pwd=123&type=JSON" dataUsingEncoding:NSUTF8StringEncoding]; // 3.利用NSURLConnection对象发送请求 [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { NSLog(@"%@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]); }];

RunLoop的结构

[图片上传退步...(image-e41dd9-1510322280020)]

Core Foundation 中关于RunLoop的5个类

CFRunLoopRef
CFRunLoopModeRef
CFRunLoopTimerRef
CFRunLoopObserveRef
CFRunLoopSource

  • CFRunLoopModeRef代表RunLoop的运维方式,系统默许注册了5个Mode
    • NSDefaultRunLoopMode:App的暗许Mode,日常主线程是在那几个Mode下运作,RunLoop在一样时段只好且必须在一种特定Mode下Run,退换Mode时, 必要暂停当前的Loop,然后重启新的Loop。
      • NSDefalutRunLoopMode      私下认可状态.空闲状态
      • UITrackingRunLoopMode     滑动ScrollView
      • UIInitializationRunLoopMode    私有,App启动时
      • NSRunLoopCommonModes     默许包涵地点第一和第二
    • UITrackingRunLoopMode:分界面追踪Mode,用于 ScrollView 追踪触摸滑动,保障分界面滑动时不受别的 Mode 影响
    • NSRunLoopCommonModes: 那是贰个占位用的Mode,不是一种真正的Mode。
  • CFRunLoopTimerRef是依靠时间的触发器
    • CFRunLoopTimerRef基本上说的正是NSTimer,它受RunLoop的Mode影响。
  • CFRunLoopSourceRef是事件源(输入源)
    • Source0:管理App内部事件,App自身担任管理(触发),如UIEvent,CFSocket。
    • Source1:由RunLoop和根本管理,Mach port驱动,如CFMachPort、CFMessagePort。
  • CFRunLoopObserverRef是观望者,能够监听RunLoop的情形改换,向里面报告RunLoop当前事态的转移,框架中众多编写制定都由RunLoopObserve触发,如 CAAnimation。

    betway体育app 5

    CFRunLoopObserverRef Activities

打字与印刷activity,查看RunLoop运市场价格况

// 1.创建Observer
// 第一个参数:用于分配该observer对象的内存
// 第二个参数:用以设置该observer所要关注的的事件
// 第三个参数:用于标识该observer是在第一次进入run loop时执行, 还是每次进入run loop处理时均执行
// 第四个参数:用于设置该observer的优先级
// 第五个参数: observer监听到事件时的回调block
    CFRunLoopObserverRef observer = CFRunLoopObserverCreateWithHandler(CFAllocatorGetDefault(), kCFRunLoopAllActivities, YES, 0, ^(CFRunLoopObserverRef observer, CFRunLoopActivity activity) {
        switch(activity)
        {
            case kCFRunLoopEntry:
                NSLog(@"即将进入loop");
                break;
            case kCFRunLoopBeforeTimers:
                NSLog(@"即将处理timers");
                break;
            case kCFRunLoopBeforeSources:
                NSLog(@"即将处理sources");
                break;
            case kCFRunLoopBeforeWaiting:
                NSLog(@"即将进入休眠");
                break;
            case kCFRunLoopAfterWaiting:
                NSLog(@"刚从休眠中唤醒");
                break;
            case kCFRunLoopExit:
                NSLog(@"即将退出loop");
                break;
            default:
                break;
        }
    });

//     2.添加监听
    /*
     第一个参数: 给哪个RunLoop添加监听
     第二个参数: 需要添加的Observer对象
     第三个参数: 在哪种模式下监听
     */
    CFRunLoopAddObserver(CFRunLoopGetMain(), observer, kCFRunLoopDefaultMode);

//     3,释放observer
    CFRelease(observer);

betway体育app 6

本文由必威发布于必威-编程,转载请注明出处:随机配图betway体育app:,就是运行循环

TAG标签:
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。