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的特性来实现一个类似的例子,给我们以后的开发和代码设计提供思路。
iOS Responder chain 前言 事件的传递及响应过程, 如图: `Hit-Test`机制: (寻找响应者) `Hit-Test`方法伪实现如下: 前言 iOS中所有继承自UIResponder...的类的实例, 都是可以响应touch事件的对象....响应机制分为传递链和响应链....传递链: 由系统向离用户最近的view传递: UIApplication -> UIWindow -> RootViewController -> View -> ... -> Button 响应链:..., 如图: 图片 向右指的箭头为传递链, 向左指的箭头为响应链. ---- Hit-Test机制: (寻找响应者) 当发生touch后, 系统会将touch以UIEvent的方式, 加入到UIApplication
RunLoop的字面意思是运行循环、跑圈,一个App启动后能一直执行,就是因为启动后进入了一个循环,在这个循环中不断监听各种状态、手势动作,并做出相应的响应。...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和线程的关系: 一个
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 的关系?...程序中添加每3秒响应一次的NSTimer,当拖动tableview时timer可能无法响应要怎么解决? Runloop 是怎么响应用户操作的, 具体流程是什么样的? 说说RunLoop的几种状态?...当没有事件消息传入的时候,RunLoop就休息了。这里只是简单的理解一下这张图,接下来我们来了解RunLoop对象和其一些相关类,来更深入的理解RunLoop运行流程。 三....因此每一个应用必须要有一个runloop, 我们知道主线程一开起来,就会跑一个和主线程对应的RunLoop,那么RunLoop一定是在程序的入口main函数中开启。...RunLoop和线程间的关系 每条线程都有唯一的一个与之对应的RunLoop对象 RunLoop保存在一个全局的Dictionary里,线程作为key,RunLoop作为value 主线程的RunLoop
UIApplication 获取到Event之后,Application就纠结于到底要把这个事件传递给那个View来响应这个事件,这时候就要依靠HitTest来决定了。...iOS中,Hit-Test的作用就是找出这个触摸点下面的View是什么,HitTest会检测这个点击的点是不是发生在这个View上,如果是的话,就会去遍历这个View的subviews,直到找到最小的能够处理事件的
的存储方式是键值对,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。...2.3.2 Runloop的管理并不完全是自动的。 我们仍必须设计线程代码以在适当的时候启动run loop并正确响应输入事件,当然前提是线程中需要用到run loop。
由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开发中,我们一直在用,却从未注意过他,甚至都不从见过他的面孔,那个这个神秘的家伙究竟是做什么的?...HELLO WORLD程序,打印出字符串后程序就结束了,那么,我们的app是如何实现如下这样的机制的呢:app从运行开始一直处于待命状态,接收到类似点击事件等用户交互后执行相应操作,完成后继续等待交互响应...我们这里只来讨论NSRunLoop的属性和方法: + (NSRunLoop *)currentRunLoop; 获取当前线程的RunLoop:有则获取,无则创建 + (NSRunLoop *)mainRunLoop...- (void)acceptInputForMode:(NSString *)mode beforeDate:(NSDate *)limitDate; 在某个时间期限前接收响应 - (void)run;...2、当你在线程中使用如下方法时 某些延时函数和选择器在分线程中的使用,我们也必须手动开启runloop,这些方法如下: @interface NSObject (NSDelayedPerforming
引言 Responder Chain(响应者链)【上篇】 响应者链的事件传递过程 抽屉效果 在这里插入图片描述 I 完整的触摸过程 1.1 一次完整的触摸过程,会经历3个状态: 触摸开始:- (void...可能会经历):- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event 4个触摸事件处理方法中,都有NSSet *touches和UIEvent...UITouch的个数可以判断出是单点触摸还是多点触 判断多少次点击:UITouch的属性@property(nonatomic,readonly) NSUInteger tapCount; 1.2 事件的产生和传递...II 响应者链的事件传递过程 1).如果view的控制器存在,就传递给控制器;如果控制器不存在,则将其传递给它的父视图 2).在视图层次结构的最顶级视图,如果也不能处理收到的事件或消息,则其将事件或消息传递给...see also iOS 小技能:响应者链的事件传递过程、手势识别器的使用步骤、抽屉效果的实现https://kunnan.blog.csdn.net/article/details/74107917
IV 什么是响应者链?...iOS中的响应者链(Responder Chain)是用于确定事件响应者的一种机制,其中的事件主要指触摸事件(Touch Event),该机制和UIKit中的UIResponder类紧密相关。...一个事件响应者的完成主要经过两个过程:hitTest方法命中视图和响应者链确定响应者。...hitTest方法首先从顶部UIApplication往下调用(从父类到子类),直到找到命中者,然后从命中者视图沿着响应者链往上传递寻找真正的响应者。...4.2.响应者链 通过命中测试找到命中者后,任务并没有完成,因为最终的命中者不一定是事件的响应者。
这是您的线程进入的一个循环,用于响应传入事件而运行事件处理程序。您的代码提供了驱动runloop的while or for循环。...下图显示了runloop和各种来源的概念结构。 ?...3. runloop 与线程的关系 苹果没有提供创建runloop的接口,只提供了两个自动获取的函数:CFRunLoopGetMain() 和 CFRunLoopGetCurrent()。...主线程的 RunLoop 里有两个预置的 Mode:kCFRunLoopDefaultMode 和 UITrackingRunLoopMode。...使用时注意区分这个字符串和其他 mode name。 5. runloop 的内部逻辑 ?
概要 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...,那么就可以判定出此时主线程卡顿,下面的代码片段来源iOS实时卡顿监控 static void runLoopObserverCallBack(CFRunLoopObserverRef observer
我们知道UIAlertView使用delegate返回数据实现的,使用麻烦,之前介绍过用Block实现的例子《ios实战-使用Block的UIAlertView》 今天介绍使用runloop实现,用return
领取专属 10元无门槛券
手把手带您无忧上云