NSRunLoop总结

弄清楚NSRunLoop确实需要花时间,这个类的概念和模式似乎是Apple的平台独有(iOS+MacOSX),很难彻底搞懂(iOS没开源)。官网的解释是说run loop可以用于处理异步事件,很抽象的说法。

一、认识NSRunLoop

NSRunLoop是消息机制的处理模式,其作用在于:有事情做的时候使的当前NSRunLoop的线程工作,没有事情做让当前NSRunLoop的线程休眠。NSRunLoop就是一直在循环检测,从线程start到线程end,检测inputsource(如点击,双击等操作)同步事件,检测timesource同步事件,检测到输入源会执行处理函数,首先会产生通知,corefunction向线程添加runloop observers来监听事件,意在监听事件发生时来做处理。

在单线程的app中,不需要注意Run Loop,但不代表没有。程序启动时,系统已经在主线程中加入了Run Loop。它保证了我们的主线程在运行起来后,就处于一种“等待”的状态(而不像一些命令行程序一样运行一次就结束了),这个时候如果有接收到的事件(Timer的定时到了或是其他线程的消息),就会执行任务,否则就处于休眠状态。

注意: 所有线程都自动创建一个RunLoop, 在线程内通过 [NSRunLoop currentRunLoop] 获得当前线程的RunLoop.

为了证明它确实是使用的RunLoop, 我将程序在响应鼠标单击按钮时的调用栈显示如下:

了解了NSRunLoop的作用后,我们再来看一下它的应用范围:

由上图我们可知,NSRunLoop响应两种类型的消息: Input sources 和 Timer sources. 就是前面我们讲到的,它在等待响应消息时,只处理这两种消息源。

1.Time Source. Timer sources deliver synchronous events, occurring at a scheduled time or repeating interval.

苹果文档中有句话需要注意,Timer sources deliver events to their handler routines but do not cause the run loop to exit.

创建NSTimer添加到run loop中的时候,这里需要注意的是,NSTimer默认是处于NSDefaultRunloopMode,这也就可以解释为什么如果你在你的控制器中添加了一个timer定时刷新你的界面,而你在拖动视图的时候timer不回fire,因为这个时候你的runloop 是NSEventTrackingRunloopMode,在这个mode下timer不回fire。

2.input source input source 主要是一些异步的事件,比如来自其它线程或者其它app的消息。

input source 传递异步事件到其对应的处理函数,并且使runUntilDate(与线程相关联的runloop对象调用)返回。

为了能够处理input sourcr,run loops 产生notifications.通过注册成run-loop observers可以接受到这些通知(通过Core Foundation 来注册observers).

二、使用NSRunLoop

● Run Loop和线程的关系:

1. 主线程的run loop默认是启动的,用于接收各种输入sources

2. 对第二线程来说,run loop默认是没有启动的(但是确实是存在的),如果你需要更多的线程交互则可以手动配置和启动,如果线程执行一个长时间已确定的任务则不需要。

● Run Loop什么情况下使用:

1. 使用ports 或 input sources 和其他线程通信   // 不了解

2. 在线程中使用timers                                             // 如果不启动run loop,timer的事件是不会响应的

3. 在Cocoa 应用中使用performSelector...方法   // 应该是performSelector...这种方法会启动一个线程并启动run loop吧

4. 让线程执行一个周期性的任务

● 跟NSRunLoop密切相关的知识点

1. timer的创建和释放必须在同一线程中。

[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];  

此方法会retain timer对象的引用计数。

2. NSTimer要添加到RunLoop中才会有作用 NSTimer加到了RunLoop中但迟迟的不触发事件,可能是因为线程没有启动。

三、NSRunLoop几个常用的方法:

+ (NSRunLoop *)currentRunLoop; //获得当前线程的run loop

+ (NSRunLoop *)mainRunLoop; //获得主线程的run loop

- (void)run; //进入处理事件循环,如果没有事件则立刻返回。注意:主线程上调用这个方法会导致无法返回(进入无限循环,虽然不会阻塞主线程),因为主线程一般总是会有事件处理。

- (void)runUntilDate:(NSDate *)limitDate; //同run方法,增加超时参数limitDate,避免进入无限循环。使用在UI线程(亦即主线程)上,可以达到暂停的效果。

- (BOOL)runMode:(NSString *)mode beforeDate:(NSDate *)limitDate; //等待消息处理,好比在PC终端窗口上等待键盘输入。一旦有合适事件(mode相当于定义了事件的类型)被处理了,则立刻返回;类同run方法,如果没有事件处理也立刻返回;有否事件处理由返回布尔值判断。同样limitDate为超时参数。

- (void)acceptInputForMode:(NSString *)mode beforeDate:(NSDate *)limitDate; //似乎和runMode:差不多(测试过是这种结果,但确定是否有其它特殊情况下的不同),没有BOOL返回值。

参考文章如下 :

1. csdn-龙炎其实是王老师

2. csdn-Topurce

3. csdn-技术内幕

4. 亚庆的 Blog

时间: 2024-10-08 21:28:41

NSRunLoop总结的相关文章

NSRunLoop && NSTimer

新的一年的开始,希望大家一切越来越好,越来越开心快乐!!! 定时器及运行循环 NSRunLoop是iOS消息机制的处理模式 NSRunLoop的主要作用:控制NSRunLoop里面线程的执行和休眠,在有事情做的时候使当前NSRunLoop控制的线程工作,没有事情做让当前NSRunLoop的控制的线程休眠. 通过所有的“消息”都被添加到了NSRunLoop中去,而在这里这些消息并分为“input source”和“Timer source” 并在循环中检查是不是有事件需要发生,如果需要那么就调用相

iOS开发中NSRunloop跟NSTimer的问题

在Windows时代,大家肯定对SendMessage,PostMessage,GetMessage有所了解,这些都是windows中的消 息处理函数,那对应在ios中是什么呢,其实就是NSRunloop这个东西.在ios中,所有消息都会被添加到NSRunloop中,分为'input source'跟'timer source'种,并在循环中检查是不是有事件需要发生,如果需要那么就调用相应的函数处理. 我们在使用NSTimer的时候,可能会接触到runloop的概念, 下面是一个简单的例子 -

Cocoa Touch(六):App运行机制 NSRunLoop, KVC, KVO, Notification, ARC

事件循环NSRunLoop 1.run loop概念 NSRunLoop类封装了线程进入事件循环的过程,一个runloop实例就表示了一个线程的事件循环. 处于事件循环的线程接收的事件源有两种:input source 和 timer source.线程调用便利函数 [NSTimer scheduledTimerWithTimeInterval: target: selector: userInfo: repeats:] 在创建一个NSTimer实例的同时,以默认模式Default mode在当

NSRunloop

1.[NSRunloop mainRunloop] [NSRunloop currentRunloop] 一个线程对应一个runloop scrollView滚动时,runloop会切换到tracking模式,而定时器默认在default模式,所以不好使 子线程执行完任务就进入消亡状态,如果强引用,重新start是会崩溃 即将进入runloop之前,判断当前mode空不空,如果空,直接退出

NSRunLoop 的那些事--持续更新

本文主要介绍NSRunLoop概念.特性及其应用. 一.NSRunLoop是什么.有什么用? 我们先看官方定义: “The NSRunLoop class declares the programmatic interface to objects that manage input sources. An NSRunLoop object processes input for sources such as mouse and keyboard events from the window

NSRunLoop的进一步理解

iPhone应用开发中关于NSRunLoop的概述是本文要介绍的内容,NSRunLoop是一种更加高明的消息处理模式,他就高明在对消息处理过程进行了更好的抽象和封装,这样才能是的你不用处理一些很琐碎很低层次的具体消息的处理,在NSRunLoop中每一个消息就被打包在input source或者是timer source中了,来看详细内容. 1.什么是NSRunLoop 我们会经常看到这样的代码: - (IBAction)start:(id)sender { pageStillLoading =

[iOS]浅谈NSRunloop工作原理和相关应用

一. 认识NSRunloop  1.1 NSRunloop与程序运行 那么具体什么是NSRunLoop呢?其实NSRunLoop的本质是一个消息机制的处理模式.让我们首先来看一下程序的入口——main.m文件,一个ios程序启动后,只有短短的十行代码居然能保持整个应用程序一直运行而没有退出,是不是有点意思?程序之所以没有直接退出是因为UIApplicationMain这个函数内部默认启动了一个跟主线程相关的NSRunloop对象,而UIApplicationMain这个函数一直执行没有返回就保存

ios:NSRunLoop

ios:NSRunLoop 1.NSRunLoop是消息机制的处理模式 NSRunLoop的作用在于有事情做的时候使的当前NSRunLoop的线程工作,没有事情做让当前NSRunLoop的线程休眠 2.nstimer默认添加到当前NSRunLoop中,也可以手动制定添加到自己新建的NSRunLoop的中 [NSTimer schduledTimerWithTimeInterval: target:selector:userInfo:repeats]; 此方法默认添加到当前NSRunLoop中 N

NSRunLoop的利用

一.NSRunLoop的理解 在初学C语言编程的时候,经常会写一种控制台中的程序,程序启动黑色的输入框,等待用户的输入,输入一组数据之后程序继续往下执行程序在等待用户输入数据时会阻塞,这是一种最简单的单线程程序执行的模式.这种简单的编程模型在实际的应用中很难满足用户的需要,比如ios中的app的主线程需要同时响应多种消息,用户触摸事件.timer定时器到时.其它线程发送过来的消息,很自然可以想到为了都能处理到这些消息,那么就在一个while循环中,循环遍历处理这些不同是事件(source),这就

NSRunLoop详解

1.NSRunLoop是IOS消息机制的处理模式 NSRunLoop的主要作用:控制NSRunLoop里面线程的执行和休眠,在有事情做的时候使当前NSRunLoop控制的线程工作,没有事情做让当前NSRunLoop的控制的线程休眠. 2.NSRunLoop 就是一直在循环检测,从线程start到线程end,检测inputsource(如点击,双击等操作)同步事件,检测timesource同步事件,检测到输入源会执行处理函数,首先会产生通知,corefunction向线程添加runloop obs