美文网首页
Run Loop 小记

Run Loop 小记

作者: 我的昵称是小狼 | 来源:发表于2018-06-07 17:19 被阅读0次

Runloop基本来说就是一个事件处理的循环,一般用来调度协调事件.

Runloop的目的就是当你的线程有任务的时候处理任务,当没有任务的时候让你的线程休眠.

Runloop 会接收两种类型的Soure:

一种是InputSource (异步处理事件),一般用是其他线程来的消息,或者其他APP来的消息

一中是TimerSource(同步处理事件),被定时器调度产生的事件

Runloop

上图展示了一个线程的Runloop的处理事件的流程,当runloop处理InputSource时,会调用runUntilDate方法结束runloop.处理TimerSource事件的时候runloop不会结束.

Runloop Mode

Runloop Mode 就是一个监听InputSource和TimerSoure 和Runloop回调的观察者集合.runloop每次循环都会指定一个模式,而且仅仅在这个模式下的Source会被执行.

系统一共提供了以下几种mode

NSDefaultRunLoopMode (kCFRunLoopDefaultMode):默认的模式,大部分操作都在这个模式下,大部分时间都会使用这个mode

UITrackingRunLoopMode : 追踪滑动情况下的模式

NSRunLoopCommonModes : 集合mode ,所有的runloop model 回调都会触发

Input Sources

Input Sources 异步的处理线程的任务,Input Source一般分为两种

一种为Port Sources,Port Source 一般由系统自动配置好的

一种为Custom Input Sources

Perform Selector Sources 是 Custom Input Sources的一种特殊情况

Timer Sources 同步处理任务,为了定时器的回调不受mode的影响,可以选择将定时器加入NSRunLoopCommonModes

Run Loop Observers 

当runloop执行的时候,runloop的观察者会触发通知,触发通知的事件如下:

1.进入runloop循环

2.runloop将要处理定时器事件

3.runloop将要处理Input Source

4.runloop将要休眠

5.runloop被唤醒,但是此时还没有开始处理唤醒runloop的事件

5.runloop退出

你可以添加runloop observe 来追踪runloop处理事件的时机去处理额外的任务

配置并使用Runloop

在主线程中Runloop是默认启动的,只有你创建了子线程,并在子线程中需要做处理InputSource事件,处理定时器,使用performSelector执行延时方法,保持线程存在一段时间,才需要在子线程中启动runloop.

使用[NSRunLoop currentRunLoop]就会自动创建runloop,你可以选择有三种方法启动runloop,

run方法无条件启动,但是结果是无法结束runloop

runMode beforeDate 指定过期时间和mode启动,也是无法结束runloop

runUntilDate 指定过期时间启动,可以通过CFRunLoopStop结束runloop

监听runloop的状态:

//创建Observer上下文

CFRunLoopObserverContext context = {0,self,NULL,NULL,NULL};

//创建Observer

 CFRunLoopObserverRef obsever =  CFRunLoopObserverCreate(kCFAllocatorDefault, kCFRunLoopAllActivities, YES, 0, &RunloopObsever, &context);

//添加Observer

CFRunLoopAddObserver([[NSRunLoop currentRunLoop] getCFRunLoop], obsever, kCFRunLoopCommonModes);

相关文章

  • Run Loop 小记

    Runloop基本来说就是一个事件处理的循环,一般用来调度协调事件. Runloop的目的就是当你的线程有任务的时...

  • runloop

    走进Run Loop的世界 (一):什么是Run Loop?走进Run Loop的世界 (二):如何配置Run L...

  • iOS Runloop学习笔记

    一、** what is run loop ** 1、A run loop is an abstraction t...

  • iOS开发之Run loop

    1.什么是Run loop,Run loop有什么作用? 2.Run loop 是怎么运作的? 3.什么情况下使用...

  • 详解Run Loop

    Run Loop Run Loop是事件驱动的。 iOS中有2套API来访问使用Run LoopFoundatio...

  • iOS Runloop(二)

    Run Loop观察者源是合适的同步或异步事件发生时触发,而run loop观察者则是在run loop本身运行的...

  • python asyncio并发编程(3)

    1. loop.run_forever()与loop.run_until_complete()的区别 (1) l...

  • IOS多线程编程指南二之Runloop

    一、什么是Runloop A run loop is an event processing loop that ...

  • Run Loops基础概念篇二

    When Would You Use a Run Loop? 你唯一要使用run loop,就是当你要在appli...

  • CFRunLoop -- API

    获取 Run Loop 的方法 运行以及停止 Run Loop 的方法 管理 Sources 的方法 管理 Obs...

网友评论

      本文标题:Run Loop 小记

      本文链接:https://www.haomeiwen.com/subject/nxbwsftx.html