2019独角兽企业重金招聘Python工程师标准>>>

A run loop for a given thread will wait until one or more of its input sources has some data or event, then fire the appropriate input handler(s) to process each input source that is "ready." After doing so, it will then return to its loop, processing input from various sources, and "sleeping" if there is no work to do. NSRunLoop is better than sleep because it allows the runloop to respond to events while you wait. If you just sleep your thread your app will block even if events arrive.

其实说的简单点儿,NSRunLoop的本质是一个消息机制的处理模式。系统级的RunLoop所示如下

关于 (BOOL) runMode:(NSString *)mode beforeDate:(NSDate *)date这个方法,具体的参数解释如下:

1. mode指定runloop模式来处理输入源。

2. 当date设置为[NSDate distantFuture](将来,基本不会到达的时间),所以除非处理其他输入源结束,否则永不退出处理暂停的当前处理的流程。

一般情况下,当我们使用NSRunLoop的时候,代码都如下所示:

do {

[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDatedistantFuture]];

} while (!done);

在上面的代码中,参数done为NO的时候,当前runloop会一直接收处理其他输入源,处理输入源之后会再回到runloop中等待其他的输入源;除非done为NO,否则当前流程一直再runloop中,我们用下面的一个实例来详细的解释如何使用NSRunLoop。

- (void) downloadImage:(NSString*)url{

_subThreed = [NSThread currentThread];

NSAutoreleasePool *uploadPool = [[NSAutoreleasePool alloc] init];

done = NO;

characterBuffer = [NSMutableData data];

[[NSURLCache sharedURLCache] removeAllCachedResponses];

NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:[NSURLURLWithString:url]];

connection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self];

if (connection != nil) {

do {

[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDatedistantFuture]];

} while (!done);

}

imageView.image = [UIImage imageWithData:characterBuffer];

// Release resources used only in this thread.

connection = nil;

[uploadPool release];

uploadPool = nil;

_subThreed = nil;

}

上面这段代码特别有意思的地方在于,当实例化一个connection之后,马上执行download图片的代理事件,同时当前进程进NSRunLoop,在这个过程中,可以响应某些输入源,比如操作界面上的控件:点击某个button,滑动等等事件,这些事件都可以顺利执行。直到done为YES的时候,这个NSRunLoop才会结束(在具体的代码中,我们可以在connection的didFailWithError 或者connectionDidFinishLoading代理事件中设置),结束NSRunLoop后, 代码会继续执行下面一行:

imageView.image = [UIImage imageWithData:characterBuffer];

下面是代码在NSRunLoop中处理外部输入源的时候callstack,我们可以清楚的看见这里比较明显的有两个thread,其中之一是NSRunLoop(thread 13),而另外的一个是外部输入源的thread(thread 1)。

所以说到这里,我的理解是上面的NSRunLoop代码和异步网络访问比较类似,不同点在于NSRunLoop在connection结束后会重设循环条件,这样就结束NSRunLoop的运行,然后NSRunLoop后面的代码就继续执行,而异步网络访问则需要在connection的connectionDidFinishLoading里面执行后续的代码。为什么这样做呢,其实道理很简单,为了让整个代码的逻辑更加清楚,如果我们没有这样的一个runloop的话,就不得不在子线程的结束的地方,加上imageView.image = [UIImage imageWithData:characterBuffer];(这个有可能是界面操作),则显得代码不够紧凑,容易出错。

转载于:https://my.oschina.net/sunqichao/blog/178277

ios RunLoop 用法相关推荐

  1. iOS runloop

    iOS runloop 字数1601 阅读6946 评论8 喜欢113    写这篇文章开始之前,我都不知道runloop是什么东西,如果从字面的意思翻译应该是一直循环的跑,怀疑可能和死锁有关系,可是 ...

  2. iOS RunLoop基础和应用举例

    文章目录 RunLoop介绍 iOS 中的RunLoop RunLoop应用举例 保证线程的存活 AFNetworking NSTimer 补充说明 参考文档及更多资料 关于autoreleasepo ...

  3. iOS RunLoop详解

    一.简介 CFRunLoopRef源码 RunLoop是一个对象,这个对象在循环中用来处理程序运行过程中出现的各种事件(比如说触摸事件.UI刷新事件.定时器事件.Selector事件),从而保持程序的 ...

  4. ios Runloop

    一.概念:一个Runloop就是一个事件处理的循环,用来不停的调度工作和处理输入事件,使用runloop的目的是让你的线程在有工作的时候处于工作状态,没有工作的时候处于休眠状态. 一般来讲,一个线程一 ...

  5. iOS RunLoop 初识

    今天突然才之间才意识到NSTimer这样的运行方式,是在多线程中实现的循环还是在主线程中去实现的呢.当然不可能是在主线程中的while那么简单,那样什么都干不了,简单看了下NSTimer是以同步方式运 ...

  6. ios runloop学习

    今天突然才之间才意识到NSTimer这样的运行方式,是在多线程中实现的循环还是在主线程中去实现的呢.当然不可能是在主线程中的while那么简单,那样什么都干不了,简单看了下NSTimer是以同步方式运 ...

  7. iOS RunLoop 原理和核心机制

    RunLoop的定义 当有持续的异步任务需求时,我们会创建一个独立的生命周期可控的线程.RunLoop就是控制线程生命周期并接收事件进行处理的机制. RunLoop是iOS事件响应与任务处理最核心的机 ...

  8. iOS - RunLoop 深入理解

    一直不是很了解iOS的runloop机制的具体机制,无意间搜到这个文章,感觉非常详细,收藏了- 作者费不少劲写的,转载请注明出处,谢谢侬.-原文作者:Mitchell 孟晨 于是出处:原文地址 后面我 ...

  9. iOS RunLoop简介

    一.什么是RunLoop? RunLoop是运行循环,每个Cocoa应用程序都由一个处于阻塞状态的do/while循环驱动,当有事件发生时,就把事件分派给合适的监听器,如此反复直到循环停止.处理分派的 ...

最新文章

  1. 哪些编程语言需要修复?
  2. python中os.path.isdir()和os.path.isfile()的正确用法
  3. 比起掉头发,我更怕掉队
  4. C# 错误 175: 具有固定名称“System.Data.SQLite.EF6”的 ADO.NET 提供程序未在计算机或应用程序配置文件中注册或无法加载
  5. 微信小程序运行的底层逻辑
  6. HTC Desire试玩手记之四(GPS连不上)
  7. pytorch深度学习入门_立即学习AI:01 — Pytorch入门
  8. 软件质量属性:易用性
  9. 中国地图经纬度范围,用多个矩形表示大致范围
  10. socket服务器主动下发消息,socket服务器主动发送消息给客户端
  11. sap scc4 客户端设置(设置生产机不可更改代码)
  12. Java 11 发布线路图:有哪些值得期待的新特性?
  13. Kernel wmb/mb宏的作用
  14. Book04--修改软件的艺术:构建易维护代码的9条最佳实践
  15. csgo服务器显示连接中,CSGO提示连接到官方任意服务器失败怎么办?
  16. SQL server 服务报 远程过程调用失败0x800706be
  17. vue3中 inject provide的响应式使用
  18. 在达沃斯使用约会软件是怎样一番体验
  19. java并发free-coder
  20. 鼎捷t100架构_鼎捷T100 管理软件

热门文章

  1. 【weex开发】环境配置流程
  2. redis 本地安装
  3. python3 爬虫--Chrome以及 Chromedriver安装配置
  4. 基于图像切换器(imageSwitcher)的支持动画的图片浏览器
  5. VMware10.0.4下 CentOS 6.5 cmake安装 MySQL 5.5.32
  6. SVN 服务端、客户端安装及配置、导入导出项目
  7. OpenGL超级宝典笔记——遮挡查询 [转]
  8. 新媒体技术发展迅猛 手机将让生活产生巨变(转)
  9. ASP.NET Core2基于RabbitMQ对Web前端实现推送功能
  10. 【iCore1S 双核心板_ARM】例程十七:FSMC实验——读写FPGA