Runloop

1:runloop是什么?html

runloop是一个循环,它是程序运行的基石;主要功能有:
可以保持程序的持续运行
处理App中的各类事件(好比触摸事件、定时器事件、Selector事件)
提升程序性能:有事件须要处理就运行起来;没有任务的时候处于睡眠状态;节省CPU资源;

UIApplication 中一直开启一个runloop来保证程序正常运行.ios

2:runloop与线程之间的关系app

每条线程都有惟一的一个与之对应的RunLoop对象(主线程runloop默认开启,子线程runloop须要手动开启)RunLoop在第一次获取时建立,在线程结束时销毁

3.runloop相关类介绍:oop

CFRunLoopModeRef:
  一个RunLoop包含若干个 Mode,每一个Mode又包含若干个Source/Timer/Observer
  每次RunLoop启动时,只能指定其中一个 Mode,这个Mode被称做 CurrentMode(当且仅当指定一个mode)
  若是须要切换Mode,只能退出Loop,再从新指定一个Mode进入
  这样作主要是为了分隔开不一样组的Source/Timer/Observer,让其互不影响
  
  ModeType:
  kCFRunLoopDefaultMode:App的默认Mode,一般主线程是在这个Mode下运行
  UITrackingRunLoopMode:界面跟踪 Mode,用于 ScrollView 追踪触摸滑动,保证界面滑动时不受其余Mode影响
  UIInitializationRunLoopMode: 在刚启动 App 时第进入的第一个 Mode,启动完成后就再也不使用
  GSEventReceiveRunLoopMode: 接受系统事件的内部 Mode,一般用不到
  kCFRunLoopCommonModes: 这是一个占位用的Mode,不是一种真正的Mode(是几种mode的集合)
  
CFRunLoopSourceRef
  CFRunLoopSourceRef是事件源(输入源)能够分为两类:
  Port-Based Sources (基于端口,跟其余线程交互,经过内核发布的消息)
  Custom Input Sources (自定义类型)
  Cocoa Perform Selector Sources (performSelector…方法)
  包含两种事件:Source0(大可能是自定义方法), Source1(基于系统)
  Source0: event事件,只含有回调,须要先调用CFRunLoopSourceSignal(source),将这个 Source 标记为待处理,而后手动调用 CFRunLoopWakeUp(runloop) 来唤醒 RunLoop。
Source1: 包含了一个 mach_port 和一个回调,被用于经过内核和其余线程相互发送消息,能主动唤醒 RunLoop 的线程

CFRunLoopObserverRef:
  observer:顾名思义就是一个观察者;来观察runloop不一样的状态
  /* Run Loop Observer Activities */
  typedef CF_OPTIONS(CFOptionFlags, CFRunLoopActivity) {
      kCFRunLoopEntry = (1UL << 0), //进入runloop
      kCFRunLoopBeforeTimers = (1UL << 1), //开始处理timer事件以前
      kCFRunLoopBeforeSources = (1UL << 2), //开始处理source事件钱
      kCFRunLoopBeforeWaiting = (1UL << 5), //开始睡眠以前
      kCFRunLoopAfterWaiting = (1UL << 6), //唤醒以后
      kCFRunLoopExit = (1UL << 7), //退出
      kCFRunLoopAllActivities = 0x0FFFFFFFU
};

3.runloop处理事件的步骤:
e004412fc56ab75a4e5d53275a4bd41c.jpg
4.runloop实际应用性能

1.滑动scrollView轮播图轮播失效,是因为定时器只运行在NSDefaultRunLoopMode下,一旦RunLoop进入其余模式,这个定时器就不会工做.而滑动的时候是trakingMode;解决方法:timer 添加到runloop的commonMode
  2.当滑动scrollView时候改变imageView图片
    (1)能够监听scrollView滑动事情来作
    (2) [imageView performSelector:@selector(setImage:) withObject:[UIImage imageNamed:@"trakingModeImageName"] afterDelay:3.0 inModes:@[UITrackingRunLoopMode]];
  3.常驻线程
   (1)粗暴的方法 while(YES){} 
   (2)添加source
      [[NSRunLoop currentRunLoop] addPort:[NSPort port] forMode:NSDefaultRunLoopMode];
   启动RunLoop:[[NSRunLoop currentRunLoop] run]; 退出:[NSThread exit];

参考内容:
http://ios.jobbole.com/85635/...
https://developer.apple.com/l...
http://opensource.apple.com/s...线程

相关文章
相关标签/搜索