认识RunLoop

一、认识RunLoop

1.什么是RunLoop?

RunLoop,顾名思义就是运行循环或者跑圈。iOS之所以可以在从后台强制推出前都可以一直运行,就是因为在iOS应用程序的main函数中调用的UIApllicationMain()函数中,创建了一个RunLoop。

2.RunLoop的基本作用

(1).保持程序的持续运行

(2).处理APP中的各种事件(比如触摸事件、定时器事件、selector事件)

(3).节省CPU资源,提高程序性能。(该做事时做事,该休息的时休息)

3.如果没有RunLoop

程序一运行就结束了

int main(int argc, char * argv[]){

NSLog(@"start main function");

return 0;    //-->程序在这儿结束

}

4.如果有RunLoop

RunLoop相当于一个无限循环

int main(int argc, char * argv[]) {

BOOL runing = YES;  // ---> 程序开始

do{

//执行各种任务,处理各种事件

//.....

}while (runing);

//一直执行do-while循环

return 0;

}

5.iOS  main函数中的RunLoop

      在第16行代码的UIApplicationMain函数内部就启动了一个RunLoop;所以UIApplicationMain函数就一直没有返回,保持了程序的持续运行。

6、RunLoop对象

1.iOS中有2套API来访问和使用RunLoop

(1).Foundation --> NSRunLoop

(2).core Foundation -->  CFRunLoopRef

NSRunLoop和CFRunLoopRef都代表着RunLoop对象

7.RunLoop与线程

(1).每条线程都有唯一的一个与之对应的RunLoop对象

(2).主线程的RunLoop已经自动创建好了,子线程的RunLoop需要主动创建

(3).RunLoop在第一次获取时创建,在线程结束时销毁

(4).相关方法:

a.获取当前线程中的RunLoop对象

//获取当前RunLoop的两种方法

[NSRunLoop currentRunLoop];

CFRunLoopGetCurrent();

这两个方法,在使用的时候,如果当前线程中已经有RunLoop对象,那么会将这个RunLoop对象直接返回。如果当前线程中没有RunLoop对象,那么就会为当前线程创建一个RunLoop对象。

b.获取主线程中的RunLoop对象

//获取主线程中的RunLoop对象

[NSRunLoop mainRunLoop];

CFRunLoopGetMain();

8.RunLoop相关类

Core Foundation 中关于RunLoop的五个类

a.CFRunLoopRef

b.CFRunLoopModelRef

c.CFRunLoopSourceRef

d.CFRunLoopTimerRef

e.CFRunLoopObserverRef

   

(1)CFRunLoopModeRef

<1>CFRunLoopModeRef代表RunLoop的运行模式

a.一个RunLoop包含若干个Model,每个Model又包含若干个Source/Timer/Observer

b.每次RunLoop启动时,只能指定其中一个Model,这个Mode称作CurrentMode.如果需要切换Mode,只能退出Loop,再重新指定一个Mode进入;这样做主要是为了分割开不同组的Source/Timer/Observer,让其互不影响

<2>系统默认注册了5个Mode

a.kCFRunLoopDefaultMode/NSDefaultRunLoopMode :APP的默认Mode,通常主线程是在这个Mode下运行

b.UITrackingRunLoopMode:界面跟踪Model,用于ScrollView追踪触摸滑动,保证界面滑动时不受其他Mode影响

c.kCFRunLoopCommonModes:这是一个占位用的Mode,不是一种真正的Mode

d.UIInitlizationRunLoopMode:在刚启动App时进入的第一个Mode,启动完成后就不再使用

e.GSEventReceiveRunLoopMode:接收系统事件的内部Mode,通常用不到

//这个代码默认是在主线程的RunLoop中的a.kCFRunLoopDefaultMode模式下执行。当滑动scrollView的时候这个操作不会执行

[self.imageView performSelector:@selector(setImage:) withObject:[UIImage imageNamed:@"luffy.jpg"]];


//将显示图片的操作放到标记为NSRunLoopCommonModes的模式下。因为kCFRunLoopDefaultMode和UITrackingRunLoopMode都被标记为NSRunLoopCommonModes。所以不管是滑动还是不滑动scrollView,这个操作都会被执行

[self.imageView performSelector:@selector(setImage:) withObject:[UIImage imageNamed:@"luffy.jpg"] afterDelay:3.0f inModes:@[NSRunLoopCommonModes]];

(2)CFRunLoopTimerRef

a.CFRunLoopTimerRef是基于时间的触发器,基本上说的就是NSTimer。

NSTimer * timer = [NSTimer timerWithTimeInterval:0.5 target:self selector:@selector(subThread) userInfo:nil repeats:YES];

//只运行在NSDefaultRunLoopMode模式,一旦RunLoop进入其他模式,这个定时器就不会工作

[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];

//定时器会跑在标记为common modes的模式下 (默认模式和界面跟踪模式都带有common modes标签)

[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];

(3)CFRunLoopSourceRef(了解)

<1>.CFRunLoopSourceRef是事件源(输入源)

按照官方文档,source的分类:

a.Port - Based Source

b.Custom InPut Source

c.Cocoa Perform Selector Source

按照函数调用栈,Source的分类:

a.Source0:非基于Port的

b.Source1:基于Port的,通过内核和其他线程通信,接收,分发系统事件

(4)CFRunLoopObserverRef

a.CFRunLoopObserverRef是观察者,能够监听RunLoop的状态改变

b.可以监听的时间有以下几个

kCFRunLoopEntry                 即将进入Loop   //1

kCFRunLoopBeforeTimers     即将处理timer   //2

kCFRunLoopBeforeSources    即将处理Source   //4

kCFRunLoopBeforeWaiting     即将进入休眠    //32

kCFRunLoopAfterWaiting       刚从休眠中唤醒   //64

kCFRunLoopExit        即将推出Loop     //128

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,546评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,224评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,911评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,737评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,753评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,598评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,338评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,249评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,696评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,888评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,013评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,731评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,348评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,929评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,048评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,203评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,960评论 2 355

推荐阅读更多精彩内容