`
lizaochengwen
  • 浏览: 667274 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

iphone——Thread,RunLoop初识1

阅读更多
每个程序至少运行于一个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进行释放和重用。
分享到:
评论

相关推荐

    swift-关于Runloop的学习心得Runloop源码分析以及学习资料

    1. 尽量避免长时间阻塞主线程,这可能导致Runloop无法正常运行,造成用户界面卡顿。 2. 适时地退出Runloop,如果一个任务完成后不再需要Runloop,应主动调用`runUntilDate(_:)`或`runMode:beforeDate:]`来结束当前...

    利用RunLoop监控卡顿

    1. `RunLoopObserver`: 这是RunLoop的观察者,可以通过`addObserver:forMode:beforeDate:`方法添加。观察者可以在RunLoop进入、退出或处理特定模式时收到通知,借此监控主线程的状态。 2. `NSTimer`: 创建一个定时器...

    Runtime-RunLoop-源码.rar

    1. RunLoop 结构与工作原理 RunLoop 包含多个模式(Mode),每个模式下又包含若干个源(Source)、定时器(Timer)和观察者(Observer)。当 RunLoop 进入某个模式时,只会处理对应模式下的源、定时器和观察者。...

    RunLoop demo

    1. **等待输入源**:RunLoop会监听各种输入源(如触摸事件、定时器等)并等待它们触发事件。 2. **处理输入源**:当事件发生时,RunLoop唤醒并处理这些事件。 3. **执行观察者**:处理完输入源后,RunLoop会执行注册...

    iOS Objective-C Runtime v723 & Runloop 打包源码

    1. 运行循环:RunLoop是一个不断循环的结构,用于接收和处理各种输入源(如触摸事件)和定时器事件。每个线程都有一个RunLoop,主线程的RunLoop默认开启,其他线程需要手动创建。 2. 输入源:RunLoop有不同类型输入...

    swift-Re.从零开始的RunLoop实践

    在Swift编程中,RunLoop是iOS、macOS等Apple平台中一个至关重要的概念,它与线程管理和事件处理紧密相关。本文将深入探讨如何从零开始实践RunLoop,特别是利用Ports和Custom Input Sources进行线程间通信以及其他...

    解密 Runloop1

    `CFRunLoopRun` 会一直运行 Runloop 直到有特定条件满足(如 Source1 触发),而 `CFRunLoopRunInMode` 可以设置运行的模式和超时时间。 7. **线程与 Runloop**: 每个线程都有一个默认的 Runloop,但不是所有线程...

    一个runloop例子

    1. **等待输入源(Input Sources)**:Runloop会检查有哪些输入源(如用户事件、定时器等)准备好数据。 2. **处理输入源**:如果有输入源准备好了数据,Runloop会调用对应的回调函数处理这些数据。 3. **执行工作...

    深入理解RunLoop | Garan no dou1

    1. **自动释放池(AutoreleasePool)**:RunLoop 在每次循环时都会创建一个新的自动释放池,处理完事件后释放,有效管理内存。 2. **事件响应(Event Response)**:iOS 中的事件处理机制,如触摸事件,通过 ...

    RunLoop 相关面试整理.pdf

    此外,当需要在后台线程执行任务时,AFNetworking通过调用[NSObject performSelector:onThread:..]将任务扔到后台线程的RunLoop执行,而不是直接在后台线程执行任务。这保证了任务的执行可以依托于RunLoop的机制。 ...

    RunLoop-线程保活.zip

    1. **创建线程**:首先,你需要创建一个新的线程,这可以通过`NSThread`类或直接继承`NSObject`并实现`performSelector:onThread:withObject:waitUntilDone:`方法来完成。 2. **启动RunLoop**:在线程的`main`函数...

    在iOS程序发生崩溃时,通过Runloop循环执行,达到挽救不被崩溃,友好的返回首

    在iOS程序发生崩溃时,通过Runloop循环执行,达到挽救不被崩溃,友好的返回首页的目的(免被产品_RunloopCrashSaveDemo

    TableView滑动优化加载在图片(SDWebImage+Runloop).zip

    1. **利用RunLoop的模式和模式中的源**:我们可以在特定的RunLoop模式下添加一个RunLoop源,当进入这个模式时,开始加载图片,离开时停止加载,这样可以避免无谓的资源消耗。 2. **控制图片加载时机**:通过监听...

    runLoop使用详情,视频讲解(七)

    1.讲讲runLoop,项目中有用到吗? 2.runLoop内部实现逻辑? 3.runLoop和线程的关系? 4.timer和runLoop的关系? 5.程序中添加每3秒响应一次的NSTimer,当拖动tableview的时候timer可能无法响应要怎么解决? 6.runLoop...

    runLoop使用详情,视频讲解(二)

    1.讲讲runLoop,项目中有用到吗? 2.runLoop内部实现逻辑? 3.runLoop和线程的关系? 4.timer和runLoop的关系? 5.程序中添加每3秒响应一次的NSTimer,当拖动tableview的时候timer可能无法响应要怎么解决? 6.runLoop...

    runLoop使用详情,视频讲解(六)

    1.讲讲runLoop,项目中有用到吗? 2.runLoop内部实现逻辑? 3.runLoop和线程的关系? 4.timer和runLoop的关系? 5.程序中添加每3秒响应一次的NSTimer,当拖动tableview的时候timer可能无法响应要怎么解决? 6.runLoop...

    runLoop使用详情,视频讲解(一)

    1.讲讲runLoop,项目中有用到吗? 2.runLoop内部实现逻辑? 3.runLoop和线程的关系? 4.timer和runLoop的关系? 5.程序中添加每3秒响应一次的NSTimer,当拖动tableview的时候timer可能无法响应要怎么解决? 6.runLoop...

    runLoop使用详情,视频讲解(五)

    1.讲讲runLoop,项目中有用到吗? 2.runLoop内部实现逻辑? 3.runLoop和线程的关系? 4.timer和runLoop的关系? 5.程序中添加每3秒响应一次的NSTimer,当拖动tableview的时候timer可能无法响应要怎么解决? 6.runLoop...

    runLoop使用详情,视频讲解(八)

    1.讲讲runLoop,项目中有用到吗? 2.runLoop内部实现逻辑? 3.runLoop和线程的关系? 4.timer和runLoop的关系? 5.程序中添加每3秒响应一次的NSTimer,当拖动tableview的时候timer可能无法响应要怎么解决? 6.runLoop...

    runLoop使用详情,视频讲解(九)

    1.讲讲runLoop,项目中有用到吗? 2.runLoop内部实现逻辑? 3.runLoop和线程的关系? 4.timer和runLoop的关系? 5.程序中添加每3秒响应一次的NSTimer,当拖动tableview的时候timer可能无法响应要怎么解决? 6.runLoop...

Global site tag (gtag.js) - Google Analytics