[关闭]
@chenbinghua 2015-09-12T10:33:15.000000Z 字数 2187 阅读 1563

iOS开发之RunLoop相关类

iOS笔记


Core Foundation中关于RunLoop的5个类

RunLoop要跑起来必须要由mode

CFRunLoopModeRef

CFRunLoopTimerRef

代码验证

拖一个UITextView到storyboard,UITextView继承自UIScrollView
此处输入图片的描述

  1. // ViewController.m
  2. #import "ViewController.h"
  3. @interface ViewController ()
  4. @end
  5. @implementation ViewController
  6. - (void)viewDidLoad {
  7. [super viewDidLoad];
  8. // scheduledTimerWithTimeInterval方法等于一下两句,将NSTimer添加到NSDefaultRunLoopMode
  9. // [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(run) userInfo:nil repeats:YES];
  10. NSTimer *timer = [NSTimer timerWithTimeInterval:2.0 target:self selector:@selector(run) userInfo:nil repeats:YES];
  11. [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
  12. }
  13. - (void)run{
  14. NSLog(@"____run");
  15. }
  16. @end

程序运行,每隔两秒就会打印一次,当拖动UITextView时,定时器失效,不会打印。原因是拖动时,主线程的RunLoop切换到UITrackingRunLoopMode模式,而定时器在NSDefaultRunLoopMode模式。

解决办法:将定时器添加到标记为common modes的模式下

  1. NSTimer *timer = [NSTimer timerWithTimeInterval:2.0 target:self selector:@selector(run) userInfo:nil repeats:YES];
  2. // 定时器会跑在标记为common modes的模式下
  3. // 标记为common modes的模式:UITrackingRunLoopMode和kCFRunLoopDefaultMode
  4. [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];

应用:当有控件滚动时,才开始做动作的需求时,可以把做动作的方法添加到NSDefaultRunLoopMode模式。

CFRunLoopSourceRef

CFRunLoopSourceRef是事件源(输入源)

按照官方文档,Source的分类

按照函数调用栈,Source的分类
Source0:非基于Port的
Source1:基于Port的,通过内核和其他线程通信

CFRunLoopObserverRef

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注