2.RunLoop和线程 ●RunLoop和线程是息息相关的,我们知道线程的作用是用来执行特定的一个或多个任务,但是在默认情况下,线程执行完之后就会退出,就不能再执行任务了。...image.png 从上图中可以看出,RunLoop就是线程中的一个循环,RunLoop在循环中会不断检测,通过Input sources(输入源)和Timer sources(定时源)两种来源等待接受事件...●CFRunLoopTimerRef:就是RunLoop模型图中提到的定时源 ●CFRunLoopObserverRef:观察者,能够监听RunLoop的状态改变 下边详细讲解下几种类的具体含义和关系...Input Sources(自定义) Cocoa Perform Selector Sources 第二种按照函数调用栈来分类: Source0 :非基于Port Source1:基于Port,通过内核和其他线程通信...下边我们举个例子大致来了解一下函数调用栈和Source。 1.在我们的项目中的Main.storyboard中添加一个Button按钮,并添加点击动作。
CFRunLoopTimerRef:就是RunLoop模型图中提到的定时源 CFRunLoopObserverRef:观察者,能够监听RunLoop的状态改变 下边详细讲解下几种类的具体含义和关系...下面我们来演示下CFRunLoopModeRef和CFRunLoopTimerRef结合的使用用法,从而加深理解。...1 首先我们新建一个iOS项目,在Main.storyboard中拖入一个Text View。...NSDefaultRunLoopMode 和 UITrackingRunLoopMode。...addTimer:timer forMode:NSRunLoopCommonModes]; 既然讲到了NSTimer,这里顺便讲下NSTimer中的scheduledTimerWithTimeInterval方法和RunLoop
1.2 RunLoop和线程 1.3 默认情况下主线程的RunLoop原理 RunLoop相关类 2.1 CFRunLoopRef 2.2 CFRunLoopModeRef 2.3 CFRunLoopTimerRef...1.2 RunLoop和线程 RunLoop和线程是息息相关的,我们知道线程的作用是用来执行特定的一个或多个任务,但是在默认情况下,线程执行完之后就会退出,就不能再执行任务了。...1.3 默认情况下主线程的RunLoop原理 我们在启动一个iOS程序的时候,系统会调用创建项目时自动生成的main.m的文件。...:就是RunLoop模型图中提到的定时源 CFRunLoopObserverRef:观察者,能够监听RunLoop的状态改变 下边详细讲解下几种类的具体含义和关系。...---- iOS多线程详尽总结系列文章: iOS多线程:『pthread、NSThread』详尽总结 iOS多线程:『GCD』详尽总结 iOS多线程:『NSOperation』详尽总结 iOS多线程:『
、Timer、Observer,那么就直接退出RunLoop RunLoop里面有两套api用来访问和使用RunLoop 1、Foundation--NSRunLoop 2、Core Foundation...--- CFRunloopRef 二者异同点: NSRunLoop和CFRunloopRef都代表RunLoop对象,NSRunLoop是对CFRunloopRef一层OC的封装 RunLoop与线程...NSDefaultRunLoopMode]; // 定时器会跑在标记为common modes的模式下 // 标记为common modes的模式:包含:UITrackingRunLoopMode和kCFRunLoopDefaultMode...dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue); // 2.指定定时期开始的时间和间隔的时间...Custom Input (自定义事件) Cocoa Perform Selector Sources 按照函数的调用栈 Source0:非基于Port的 Source1:基于Port 通过内核和其他线程通信
启动,如果当前Mode中没有任何 Source(Sources0、Sources1)、Timer,那么就直接退出RunLoop 比较有意思的是,多线程是我们在 iOS 开发过程中比较常用的一个方式,但是可能大部分人并没有关注到...OSX/iOS 系统中,提供了两个这样的对象:NSRunLoop 和 CFRunLoopRef 。...RunLoop 与线程的关系 首先,iOS开发中能遇到两个线程对象: pthread_t 和 NSThread 。...iOS中定义一个默认的模式和几种常用的模式,可通过字符串name来指定模式。你也可以自定义模式,只需要一个自定义字符串name指定模式名称。...其实不然,下一篇文章,我们将介绍iOS中RunLoop的具体应用场景,尝试利用RunLoop的特性来实现一个类似的例子,给我们以后的开发和代码设计提供思路。
1 RunLoop基础 1.1 RunLoop的基本作用 保持程序的持续运行(ios程序为什么能一直活着不会死) 处理app中的各种事件(比如触摸事件、定时器事件【NSTimer】、selector事件...类型的值 b 这个默认启动的Runloop是跟主线程相关联的 1.3 RunLoop对象 在iOS开发中有两套api来访问Runloop foundation框架【NSRunloop】 core...foundation框架【CFRunloopRef】 NSRunLoop和CFRunLoopRef都代表着RunLoop对象,它们是等价的,可以互相转换 NSRunLoop是基于CFRunLoopRef...的一层OC包装,所以要了解RunLoop内部结构,需要多研究CFRunLoopRef层面的API(Core Foundation层面) 1.4 RunLoop与线程 Runloop和线程的关系: 一个... CFRunloopSourceRef CFRunloopSourceRef是事件源也就是输入源,有两种分类模式;一种是按照苹果官方文档进行划分的,另一种是基于函数的调用栈来进行划分的(source0和source1
iOS 系统中,提供了两个这样的对象:NSRunLoop 和 CFRunLoopRef。 CFRunLoopRef是在CoreFoundation 框架内的。...对象 CFRunLoopGetCurrent(); // 获得当前线程的RunLoop对象 CFRunLoopGetMain(); // 获得主线程的RunLoop对象 RunLoop与线程的关系 线程和...苹果不允许直接创建 RunLoop,它只提供了两个自动获取的函数:CFRunLoopGetMain() 和 CFRunLoopGetCurrent()。 ?...Source1 包含了一个 mach_port 和一个回调(函数指针),被用于通过内核和其他线程相互发送消息。 2. CFRunLoopTimerRef 是基于时间的触发器。...如果一个 mode 中一个 item 都没有,则RunLoop 会直接退出,不进入循环。 ? RunLoop 这个对象,在 iOS 里由CFRunLoop 实现。
面试题 讲讲 RunLoop,项目中有用到吗? RunLoop内部实现逻辑? Runloop和线程的关系? timer 与 Runloop 的关系?...当没有事件消息传入的时候,RunLoop就休息了。这里只是简单的理解一下这张图,接下来我们来了解RunLoop对象和其一些相关类,来更深入的理解RunLoop运行流程。 三....因此每一个应用必须要有一个runloop, 我们知道主线程一开起来,就会跑一个和主线程对应的RunLoop,那么RunLoop一定是在程序的入口main函数中开启。...RunLoop和线程间的关系 每条线程都有唯一的一个与之对应的RunLoop对象 RunLoop保存在一个全局的Dictionary里,线程作为key,RunLoop作为value 主线程的RunLoop...CF的内存管理(Core Foundation) 凡是带有Create、Copy、Retain等字眼的函数,创建出来的对象,都需要在最后做一次release GCD本来在iOS6.0
的存储方式是键值对,key是当前线程,value是runloop,线程和runloop是一对一的关系,当字典为空的时候会默认创建主线程的runloop,而子线程在获取的时候才会创建。...前者是系统默认的Runloop Mode,例如进入iOS程序默认不做任何操作就处于这种Mode中,滑动UIScrollView类型的View是,主线程就切换Runloop到到UITrackingRunLoopMode...Source1包含了一个mach_port和一个回调(函数指针),被用于通过内核和其他线程相互发送消息。这种类型的Source能主动唤醒RunLoop的线程。 ?...loop 两个runloop状态 我们可以使用 CFRunLoopObserverCreateWithHandler() 来创建 observer,创建时设置要监听的状态变化和回调,再用 CFRunLoopAddObserver...,也是objc_autoreleasePoolPush和objc_autoreleasePoolPop两个函数 ?
1 Runloop机制原理 深入理解RunLoop http://www.cocoachina.com/ios/20150601/11970.html 1.1 RunLoop的概念 一般来讲...Event Loop 在很多系统和框架里都有实现,比如 Node.js 的事件处理,比如 Windows 程序的消息循环,再比如 OSX/iOS 里的 RunLoop。...OSX/iOS 系统中,提供了两个这样的对象:NSRunLoop 和 CFRunLoopRef。 ...1.2 RunLoop与线程的关系 首先,iOS 开发中能遇到两个线程对象: pthread_t 和 NSThread。...• NSURLSession 是 iOS7 中新增的接口,表面上是和 NSURLConnection 并列的,但底层仍然用到了 NSURLConnection 的部分功能 (比如 com.apple.NSURLConnectionLoader
由pthread(线程对象,说明RunLoop和线程是一一对应的)、currentMode(当前所处的运行模式)、modes(多个运行模式的集合)、commonModes(模式名称字符串集合)、commonModelItems...需要手动唤醒线程,将当前线程从内核态切换到用户态 source1: 基于port的,包含一个 mach_port 和一个回调,可监听系统端口和通过内核和其他线程发送的消息,能主动唤醒RunLoop,接收分发系统事件...监听所有状态 6、各数据结构之间的联系 线程和RunLoop一一对应, RunLoop和Mode是一对多的,Mode和source、timer、observer也是一对多的 三、RunLoop的Mode...即基于port的source1,监听端口,端口有消息就会触发回调;而source0,要手动标记为待处理和手动唤醒RunLoop Mach消息发送机制 大致逻辑为: 1、通知观察者 RunLoop 即将启动...由kCFRunLoopDefaultMode切换到UITrackingRunLoopMode下,也不会影响接收Timer事件 六、RunLoop和线程 线程和RunLoop是一一对应的,其映射关系是保存在一个全局的
AFNetworking 中如何运用 Runloop?...为此 AFNetworking 单独创建了一个线程,并在这个线程中启动了一个 RunLoop: + (void)networkRequestThreadEntryPoint:(id)__unused object...= [NSRunLoop currentRunLoop]; [runLoop addPort:[NSMachPort port] forMode:NSDefaultRunLoopMode...]; [runLoop run]; } 所以上面的代码逻辑是给子线程创建runloop和维持线程等待消息。...将这个任务扔到了后台线程的 RunLoop 中。
iOS中RunLoop机制浅探 一、浅识RunLoop RunLoop这个家伙在iOS开发中,我们一直在用,却从未注意过他,甚至都不从见过他的面孔,那个这个神秘的家伙究竟是做什么的?...现在我们可以理解了,这样一个管理线程执行任务的机制就是RunLoop机制,线程在执行中的休眠与激活就是由RunLoop对象进行管理的。...这里有一点需要我们注意,官方文档上描述,虽然每一个线程中都可以获取RunLoop对象,但是并不是每一个线程中都有这个实例对象,我们可以这样理解:如果我们不获取runloop,这个runloop就不存在,...我们这里只来讨论NSRunLoop的属性和方法: + (NSRunLoop *)currentRunLoop; 获取当前线程的RunLoop:有则获取,无则创建 + (NSRunLoop *)mainRunLoop...2、当你在线程中使用如下方法时 某些延时函数和选择器在分线程中的使用,我们也必须手动开启runloop,这些方法如下: @interface NSObject (NSDelayedPerforming
下图显示了runloop和各种来源的概念结构。 ?...3. runloop 与线程的关系 苹果没有提供创建runloop的接口,只提供了两个自动获取的函数:CFRunLoopGetMain() 和 CFRunLoopGetCurrent()。...主线程的 RunLoop 里有两个预置的 Mode:kCFRunLoopDefaultMode 和 UITrackingRunLoopMode。...使用时注意区分这个字符串和其他 mode name。 5. runloop 的内部逻辑 ?...第二个 Observer 监视了两个事件:BeforeWaiting(准备进入休眠) 时调用_objc_autoreleasePoolPop() 和 _objc_autoreleasePoolPush(
我们知道UIAlertView使用delegate返回数据实现的,使用麻烦,之前介绍过用Block实现的例子《ios实战-使用Block的UIAlertView》 今天介绍使用runloop实现,用return
概要 RunLoop在iOS开发中的应用范围并没有像runtime 那样广泛,我们通过CFRuntime的源代码可知runloop跟线程的是密不可分的,一个线程一定会创建一个对应的runloop,只是主线程创建就自动...此外,runloop并不是一个简单的do-while,作为OSX/iOS系统中Event Loop表现,runloop需要处理消息事件,在没有消息的时候休眠,有消息事件的时候立刻唤醒。 ...api文档中提到:如果没有输入源和定时源加入到runloop中,runloop就马上退出,否则通过频繁调用-runMode:beforeDate:方法来让runloop运行在NSDefaultRunLoopMode...所有的关于这个的都会拿AF2.X的代码说明这个常驻的案例,如果同学开发iOS稍微有点年长的话或者古董代码的都会用到网络第三方库ASIHTTPRequest,也用到利用CFRunLoopAddSource...while self.isCancelled == false { self.isMainThreadBlock = true DispatchQueue.main.async
RunLoop概念 RunLoop的数据结构 RunLoop的Mode RunLoop的实现机制 RunLoop与NSTimer RunLoop和线程 ---- 一、RunLoop概念 RunLoop...需要手动唤醒线程,将当前线程从内核态切换到用户态 source1: 基于port的,包含一个 mach_port 和一个回调,可监听系统端口和通过内核和其他线程发送的消息,能主动唤醒RunLoop,...监听所有状态 6、各数据结构之间的联系 线程和RunLoop一一对应, RunLoop和Mode是一对多的,Mode和source、timer、observer也是一对多的 三、RunLoop的Mode...即基于port的source1,监听端口,端口有消息就会触发回调;而source0,要手动标记为待处理和手动唤醒RunLoop Mach消息发送机制 大致逻辑为: 1、通知观察者 RunLoop 即将启动...由kCFRunLoopDefaultMode切换到UITrackingRunLoopMode下,也不会影响接收Timer事件 六、RunLoop和线程 线程和RunLoop是一一对应的,其映射关系是保存在一个全局的
当没有事件消息传入的时候,RunLoop就休息了。这里只是简单的理解一下这张图,接下来我们来了解RunLoop对象和其一些相关类,来更深入的理解RunLoop运行流程。 三....RunLoop在哪里开启 我们知道主线程一开起来,就会跑一个和主线程对应的RunLoop,那么RunLoop一定是在程序的入口main函数中开启。...RunLoop和线程间的关系 每条线程都有唯一的一个与之对应的RunLoop对象 主线程的RunLoop已经自动创建好了,子线程的RunLoop需要主动创建 RunLoop在第一次获取时创建,在线程结束时销毁...RunLoop相关类 Core Foundation中关于RunLoop的5个类 CFRunLoopRef - 获得当前RunLoop和主RunLoop CFRunLoopModeRef RunLoop...CF的内存管理(Core Foundation) 凡是带有Create、Copy、Retain等字眼的函数,创建出来的对象,都需要在最后做一次release GCD本来在iOS6.0
你要知道的iOS多线程NSThread、GCD、NSOperation、RunLoop都在这里 转载请注明出处 https://cloud.tencent.com/developer/user/1605429...iOS多线程——你要知道的NSThread都在这里 iOS多线程——你要知道的GCD都在这里 iOS多线程——你要知道的NSOperation都在这里 iOS多线程——你要知道的RunLoop都在这里...iOS多线程——RunLoop与GCD、AutoreleasePool RunLoop的执行者 __CFRunLoopRun源码解析 在前一篇文章中由于篇幅问题没有具体分析__CFRunLoopRun函数的源码...对象进入循环的事件,0xa0即kCFRunLoopBeforeWaiting | kCFRunLoopExit,监听RunLoop即将进入休眠和RunLoop对象退出循环的事件。...另一个监听器监听RunLoop对象进入休眠和退出循环的事件,回调函数同样是_wrapRunLoopWithAutoreleasePoolHandler,而优先级为2147483647即32位整数的最大值
前言 最近在写 APM 相关的东西,所以整理了一下 iOS 中卡顿监测的那些方案,不了解卡顿的原理的可以看这篇文章iOS 保持界面流畅的技巧[1],写的很好。...); 我们可以看到 RunLoop 调用方法主要集中在 kCFRunLoopBeforeSources 和 kCFRunLoopAfterWaiting之间,有人可能会问 kCFRunLoopAfterWaiting...开辟一个子线程,然后实时计算 kCFRunLoopBeforeSources 和 kCFRunLoopAfterWaiting 两个状态区域之间的耗时是否超过某个阀值,来断定主线程的卡顿情况。...self.isMonitoring { var timeout = true DispatchQueue.main.async...参考资料 [1] iOS 保持界面流畅的技巧: https://blog.ibireme.com/2015/11/12/smooth_user_interfaces_for_ios/ [2] YYFPSLabel