首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    iOS面试题:RunLoop剖析

    二、RunLoop的数据结构 NSRunLoop(Foundation)是CFRunLoop(CoreFoundation)的封装,提供了面向对象的API RunLoop 相关的主要涉及五个类: CFRunLoop...、source1、observers、timers构成 3、CFRunLoopSource 分为source0和source1两种 source0: 即非基于port的,也就是用户触发的事件。...如果线程当前正在处理繁重的任务,就有可能导致Timer本次延时,或者少执行一次)。...RunLoop通过mach_msg()函数接收、发送消息。它的本质是调用函数mach_msg_trap(),相当于是一个系统调用,会触发内核状态切换。...当我们在子请求数据的同时滑动浏览当前页面,如果数据请求成功要切回主线程更新UI,那么就会影响当前正在滑动的体验。

    84820

    iOS多线程——你要知道的RunLoop都在这里你要知道的iOS多线程NSThread、GCD、NSOperation、RunLoop都在这里

    CFRunLoopModeRef _currentMode; CFMutableSetRef _modes; ... } 其中_currentMode即代表当前RunLoop对象正在执行的...按钮点击的调用栈 从上图中可以看到程序在18处执行main函数,17执行UIApplicationMain函数,这就是程序启动过程,16是系统内部事件,15调用CFRunLoopRunSpecific后文会详细讲解该函数...,14开始执行RunLoop进入循环,13开始处理source0这个source0就是点击按钮的事件,11是真正执行source0的函数,10-0就是点击事件的整个转发处理过程,最终交由我们自定义的回调方法进行处理...在前文给了一个点击按钮的调用栈运行图,可以发现执行source0事件时是调用了一个非常长的函数来处理,为了方便查看调用栈执行的顺序,深入理解RunLoop https://blog.ibireme.com...__CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__(source0); __CFRUNLOOP_IS_CALLING_OUT_TO_A_BLOCK

    1.5K80

    RunLoop数据结构、RunLoop的实现机制、RunLoop的Mode、RunLoop与NSTimer和线程

    二、RunLoop的数据结构 NSRunLoop(Foundation)是CFRunLoop(CoreFoundation)的封装,提供了面向对象的API RunLoop 相关的主要涉及五个类: CFRunLoop...、source1、observers、timers构成 3、CFRunLoopSource 分为source0和source1两种 source0: 即非基于port的,也就是用户触发的事件。...如果线程当前正在处理繁重的任务,就有可能导致Timer本次延时,或者少执行一次)。...RunLoop通过mach_msg()函数接收、发送消息。它的本质是调用函数mach_msg_trap(),相当于是一个系统调用,会触发内核状态切换。...当我们在子请求数据的同时滑动浏览当前页面,如果数据请求成功要切回主线程更新UI,那么就会影响当前正在滑动的体验。

    64040

    Runloop的再理解(Runloop下)

    Runloop对象会提供一个入口函数(定义如下),当程序执行该入口函数后,就会进入一个do-while循环,这就是Runloop能使线程常驻的原因所在。...如果找到CFRunloop的源码,我们可以看到,CFRunloop.c的源码也就3900行左右。所以说Runloop其实比Runtime要简单多了!...是一个指向__CFRunLoop结构体的指针,__CFRunLoop结构体的定义如下: struct __CFRunLoop { CFRuntimeBase _base; pthread_mutex_t...当一个source0事件准备执行的时候,必须要先把它标记为signal状态。...CFRunloopTimer包含一个时间长度和一个回调(函数指针),当其加入到Runloop时,Runloop会注册对应的时间点,当时间点到时,Runloop会被唤醒以执行那个回调。

    84810

    【IOS开发高级系列】Runloop专题

    所以,RunLoop 实际上就是一个对象,这个对象管理了其需要处理的事件和消息,并提供了一个入口函数来执行上面 Event Loop 的逻辑。...线程执行了这个函数后,就会一直处于这个函数内部 "接受消息->等待->处理" 的循环中,直到这个循环结束(比如传入 quit 的消息),函数返回。         ...Source有两个版本:Source0 和 Source1。     • Source0 只包含了一个回调(函数指针),它并不能主动触发事件。...__CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__(source0);             __CFRUNLOOP_IS_CALLING_OUT_TO_A_BLOCK...实际上,start 这个函数的内部会获取CurrentRunLoop,然后在其中的DefaultMode添加了4个 Source0 (即需要手动触发的Source)。

    49820

    iOS常用方法——RunLoop

    CFRunLoopGetCurrent(); // 获得当前线程的RunLoop对象 CFRunLoopGetMain(); // 获得主线程的RunLoop对象 RunLoop与线程的关系 线程和 RunLoop 之间是一一对应的 CFRunLoop...CFRunLoopSourceRef 是事件产生的地方 Source0 只包含了一个回调(函数指针),它并不能主动触发事件。...当其加入到 RunLoop 时,RunLoop会注册对应的时间点,当时间点到时,RunLoop会被唤醒以执行那个回调 3. CFRunLoopObserverRef 是观察者。...RunLoop 这个对象,在 iOS 里由CFRunLoop 实现。简单来说,RunLoop 是用来监听输入源,进行调度处理的。这里的输入源可以是输入设备、网络、周期性或者延迟时间、异步回调。...input source来和其他线程进行通信 2.在线程(非主线程)中使用timer 3.使用 performSelector…系列(如performSelectorOnThread, …) 4.使用线程执行周期性工作

    75310
    领券