`
lizaochengwen
  • 浏览: 643833 次
  • 性别: 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源码分析以及学习资料

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

    利用RunLoop监控卡顿

    利用RunLoop监控卡顿的demo,对应博客:https://blog.csdn.net/dolacmeng/article/details/89343075

    解密 Runloop1

    解密 Runloop1

    Runtime-RunLoop-源码.rar

    Runtime-RunLoop-源码.rar

    RunLoop demo

    详细解释 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...

    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...

    iOS中多线程原理与runloop介绍

    iOS中多线程原理与runloop介绍

    深入理解RunLoop | Garan no dou1

    RunLoop 的概念RunLoop 与线程的关系RunLoop 的 ModeRunLoop 的内部逻辑RunLoop 的底层实现苹果 RunLoop 实现的功

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

    读懂iOS两部分核心源码: runtime & runloop,是每个iOS开发的基本素养。

    RunLoop 相关面试整理1

    1、通知观察者 RunLoop 即将启动 2、通知观察者即将要处理 Timer 事件 3、通知观察者即将要处理 source0 事件 5、如果基于端口的源( S

    一个runloop例子

    一个runloop例子

    RunLoop运行循环官方开发文档翻译

    关于运行循环的官方文档翻译,文档讲述运行循环创建开启使用等内容

Global site tag (gtag.js) - Google Analytics