每个程序至少运行于一个thread中(称为main thread),你可以认为每个thread是一个独立的处理器,每个都并行的运行着。Thread是用来为在同一个进程中并行的执行多处代码。
如果你的应用程序只有一个thread,则这个thread需要完成这个应用的所有事情。它必需对事件进行响应,更新应用程序窗口以及完成应用结果的所有运算。这样的话问题就来了,只有一个thread且它同一时间只能做一件事,如果你的应用程序有一个运算需要很长的时间那会发生什么呢?你的代码在忙于运算其需要的结果,你的应用程序则停止了对用户事件响应和更新窗口。如果这个运算进行了很长时间,则用户可能会认为应用程序已失去了响应并将其关闭。如果你将运算移到另一个thread中,则main thread则只用于事件响应和更新窗口。这就是为什么不应该在main thread中运行有时间持续消耗(堵塞)的代码。
一个在新thread中运行函数的方法:
view plain
[NSThread detachNewThreadSelector:@selector(theSelector) toTarget:self withObject:nil];
如果你有一些用户界面或者其它的代码需要对事件进行监听(如网络接口),你则要使用到run loop。每个thread会创建其自己的run loop,通常我们并不需要关心这些。Run loop同时也负责autorelease pool的创建和释放。
对于每个新建的thread都需要为其创建一个autorelease pool,如果有一个方法调用detachNewThreadSelector,则需要使用如下的autorelease pool相应的代码将其包含在内:
view plain
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
[code here]
[pool release];
Run loop(CFRunLoop)是一个事件处理循环,你可以用来安排工作并协调你所收到的事件。使用run loop的目的是保持你的thread当有事件处理时处于忙状态并当没有事件处理时进入休眠。
Run loop是一组架构用来管理thread中收到的异步消息。Run loop运行时对thread中的一个或多个事件源进行监控。当事件到达时,系统将thread唤醒并将事件发送给run loop,然后run loop将事件再次转发给你所指定的处理函数。如果没有收到事件或事件处理完成后,run loop将thread设置为休眠。你可以不为你所创建的thread设置run loop,但设置了将为用户提供很好的体验。Run loop为创建长时间运行且消耗少量资源的thread提供了可能。因为run loop将其所属thread设置为休眠状态如果没有事件收到。要对run loop进行配置,你所要做的是创建你的thread,获得对run loop对象的引用,安装你的事件处理器并运行run loop。Cocoa为你在main thread中自动配置了run loop,如果你要创建另一个长时间运行的thread,则你必须自己对run loop进行配置。
Run loop就像它的名字一样,是你thread中的一个循环并对收到的事件进行处理。你的代码提供控制语句用来对run loop进行执行——换句话说:你的代码提供while或for循环来驱动run loop。在你的循环中,你使用run loop对象来“运行”事件处理代码。事件处理代码主要进行接收事件并调用事件处理函数。
Run loop从两个不同的事件源中接收消息。Input sources(CFRunLoopSource)投递异步消息,通常来自于另一个thread或另一个应用程序。Timer sources(CFRunLoopTimer)当在计划的时间或重复的时间间隔内投递同步消息。两种事件源都使用应用程序指定的处理方式对到达的事件进行处理。下图展示了run loop和不同的事件源结构。
Input sources投递异步消息至对应的处理器并导致退出runUnitDate:方法(该方法在将run loop与thread关联时调用)的执行。Timer sources投递同步消息至对应的处理器但并不导致run loop退出。为了能对input sources进行额外处理,run loops也能根据run loop的行为产生相应的通知。注册run loop observers(CFRunLoopObserver)可以接收到这些通知并使用它们在thread上进行额外的处理。
你的应用程序不需要创建或显示的管理NSRunLoop对象。每一个NSThread对象,包括应用程序的main Thread都会自动创建一个NSRunLoop对象。如果你需要访问当前thread的run loop,你可以使用NSRunLoop对象的类方法currentRunLoop。
Timer(定时器)也是通过run loop进行处理。与run loop进行比较,你通常在你的程序中直接使用Timer。
创建一个timer的最简单方法:
view plain
[self performSelector:@selector(aSelector) withObject:nil afterDelay:1.0];
有些情况下你也可能创建自己的NSTimer对象,从而可以自己对Timer进行释放和重用。
分享到:
相关推荐
1. 尽量避免长时间阻塞主线程,这可能导致Runloop无法正常运行,造成用户界面卡顿。 2. 适时地退出Runloop,如果一个任务完成后不再需要Runloop,应主动调用`runUntilDate(_:)`或`runMode:beforeDate:]`来结束当前...
1. `RunLoopObserver`: 这是RunLoop的观察者,可以通过`addObserver:forMode:beforeDate:`方法添加。观察者可以在RunLoop进入、退出或处理特定模式时收到通知,借此监控主线程的状态。 2. `NSTimer`: 创建一个定时器...
1. RunLoop 结构与工作原理 RunLoop 包含多个模式(Mode),每个模式下又包含若干个源(Source)、定时器(Timer)和观察者(Observer)。当 RunLoop 进入某个模式时,只会处理对应模式下的源、定时器和观察者。...
1. **等待输入源**:RunLoop会监听各种输入源(如触摸事件、定时器等)并等待它们触发事件。 2. **处理输入源**:当事件发生时,RunLoop唤醒并处理这些事件。 3. **执行观察者**:处理完输入源后,RunLoop会执行注册...
1. 运行循环:RunLoop是一个不断循环的结构,用于接收和处理各种输入源(如触摸事件)和定时器事件。每个线程都有一个RunLoop,主线程的RunLoop默认开启,其他线程需要手动创建。 2. 输入源:RunLoop有不同类型输入...
在Swift编程中,RunLoop是iOS、macOS等Apple平台中一个至关重要的概念,它与线程管理和事件处理紧密相关。本文将深入探讨如何从零开始实践RunLoop,特别是利用Ports和Custom Input Sources进行线程间通信以及其他...
`CFRunLoopRun` 会一直运行 Runloop 直到有特定条件满足(如 Source1 触发),而 `CFRunLoopRunInMode` 可以设置运行的模式和超时时间。 7. **线程与 Runloop**: 每个线程都有一个默认的 Runloop,但不是所有线程...
1. **等待输入源(Input Sources)**:Runloop会检查有哪些输入源(如用户事件、定时器等)准备好数据。 2. **处理输入源**:如果有输入源准备好了数据,Runloop会调用对应的回调函数处理这些数据。 3. **执行工作...
1. **自动释放池(AutoreleasePool)**:RunLoop 在每次循环时都会创建一个新的自动释放池,处理完事件后释放,有效管理内存。 2. **事件响应(Event Response)**:iOS 中的事件处理机制,如触摸事件,通过 ...
此外,当需要在后台线程执行任务时,AFNetworking通过调用[NSObject performSelector:onThread:..]将任务扔到后台线程的RunLoop执行,而不是直接在后台线程执行任务。这保证了任务的执行可以依托于RunLoop的机制。 ...
1. **创建线程**:首先,你需要创建一个新的线程,这可以通过`NSThread`类或直接继承`NSObject`并实现`performSelector:onThread:withObject:waitUntilDone:`方法来完成。 2. **启动RunLoop**:在线程的`main`函数...
在iOS程序发生崩溃时,通过Runloop循环执行,达到挽救不被崩溃,友好的返回首页的目的(免被产品_RunloopCrashSaveDemo
1. **利用RunLoop的模式和模式中的源**:我们可以在特定的RunLoop模式下添加一个RunLoop源,当进入这个模式时,开始加载图片,离开时停止加载,这样可以避免无谓的资源消耗。 2. **控制图片加载时机**:通过监听...
1.讲讲runLoop,项目中有用到吗? 2.runLoop内部实现逻辑? 3.runLoop和线程的关系? 4.timer和runLoop的关系? 5.程序中添加每3秒响应一次的NSTimer,当拖动tableview的时候timer可能无法响应要怎么解决? 6.runLoop...
1.讲讲runLoop,项目中有用到吗? 2.runLoop内部实现逻辑? 3.runLoop和线程的关系? 4.timer和runLoop的关系? 5.程序中添加每3秒响应一次的NSTimer,当拖动tableview的时候timer可能无法响应要怎么解决? 6.runLoop...
1.讲讲runLoop,项目中有用到吗? 2.runLoop内部实现逻辑? 3.runLoop和线程的关系? 4.timer和runLoop的关系? 5.程序中添加每3秒响应一次的NSTimer,当拖动tableview的时候timer可能无法响应要怎么解决? 6.runLoop...
1.讲讲runLoop,项目中有用到吗? 2.runLoop内部实现逻辑? 3.runLoop和线程的关系? 4.timer和runLoop的关系? 5.程序中添加每3秒响应一次的NSTimer,当拖动tableview的时候timer可能无法响应要怎么解决? 6.runLoop...
1.讲讲runLoop,项目中有用到吗? 2.runLoop内部实现逻辑? 3.runLoop和线程的关系? 4.timer和runLoop的关系? 5.程序中添加每3秒响应一次的NSTimer,当拖动tableview的时候timer可能无法响应要怎么解决? 6.runLoop...
1.讲讲runLoop,项目中有用到吗? 2.runLoop内部实现逻辑? 3.runLoop和线程的关系? 4.timer和runLoop的关系? 5.程序中添加每3秒响应一次的NSTimer,当拖动tableview的时候timer可能无法响应要怎么解决? 6.runLoop...
1.讲讲runLoop,项目中有用到吗? 2.runLoop内部实现逻辑? 3.runLoop和线程的关系? 4.timer和runLoop的关系? 5.程序中添加每3秒响应一次的NSTimer,当拖动tableview的时候timer可能无法响应要怎么解决? 6.runLoop...