Runloop

从字面上讲就是运行循环

它内部实现就是do「」while,在这个循环内部不断的处理各种任务

一个线程对应一个Runloop,主线程的Runloop默认启动,子线程的Runloop是手动启动

保持程序持续运行,处理各种各样的事情,有事运行,无事休息,节省cpu资源,提高程序性能

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

Foundation:NSRunLoop

Core Foundation:CFRunLoopRef

Runloop与线程

  • 每条线程都有唯一的一个与之对应的RunLoop对象

  • 主线程的RunLoop已经自动创建好了,子线程的RunLoop需要主动创建

  • RunLoop在第一次获取时创建,在线程结束时销毁

获得RunLoop对象

  • Foundation

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

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

  • Core Foundation

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

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

Core Foundation中关于RunLoop的5个类
CFRunLoopRef
CFRunLoopModeRef
CFRunLoopSourceRef
CFRunLoopTimerRef
CFRunLoopObserverRef
CFRunLoopModeRef代表RunLoop的运行模式。
一个RunLoop包含若干个Mode,每个Mode又包含若干个(set)Source/(array)Timer/(array)Observer

每次RunLoop启动时,只能指定其中一个 Mode,这个Mode被称作CurrentMode

如果需要切换Mode,只能退出Loop,再重新指定一个Mode进入

这样做主要是为了分隔开不同组的Source/Timer/Observer,让其互不影响

mode主要是用来指定事件在运行循环中的优先级的,分为:
•   NSDefaultRunLoopMode(kCFRunLoopDefaultMode):默认,空闲状态
•   UITrackingRunLoopMode:ScrollView滑动时会切换到该Mode
•   UIInitializationRunLoopMode:run loop启动时,会切换到该mode
•   NSRunLoopCommonModes(kCFRunLoopCommonModes):Mode集合
苹果公开提供的Mode有两个:
•   NSDefaultRunLoopMode(kCFRunLoopDefaultMode)
•   NSRunLoopCommonModes(kCFRunLoopCommonModes)

Runloop的应用

  • NSTimer
  • ImageView显示
  • PerformSelector
  • 常驻线程
  • 自动释放池

runloop的mode作用是什么?

mode主要是用来指定事件在运行循环中的优先级的,分为:
•   NSDefaultRunLoopMode(kCFRunLoopDefaultMode):默认,空闲状态
•   UITrackingRunLoopMode:ScrollView滑动时会切换到该Mode
•   UIInitializationRunLoopMode:run loop启动时,会切换到该mode
•   NSRunLoopCommonModes(kCFRunLoopCommonModes):Mode集合
苹果公开提供的Mode有两个:
•   NSDefaultRunLoopMode(kCFRunLoopDefaultMode)
•   NSRunLoopCommonModes(kCFRunLoopCommonModes)
如果我们把一个NSTimer对象以NSDefaultRunLoopMode(kCFRunLoopDefaultMode)添加到主运行循环中的时候, ScrollView滚动过程中会因为mode的切换,而导致NSTimer将不再被调度。当我们滚动的时候,也希望不调度,那就应该使用默认模式。但是,如果希望在滚动时,定时器也要回调,那就应该使用common mode。

NSTimer使用时的注意事项

注意timer添加到runloop时应该设置为什么mode
•   注意timer在不需要时,一定要调用invalidate方法使定时器失效,否则得不到释放

 在开发中如何使用RunLoop?什么应用场景?

在子线程中开启一个定时器

在子线程中进行一些长期监控

可以控制定时器在特定模式下执行

可以添加Observer监听RunLoop的状态,比如监听点击事件的处理(在所有点击事件之前做一些事情)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值