笔谈runloop(一)
关于runloop熟悉而又陌生,熟悉的是在iOS开发的过程中线程的执行就跟runloop扯上关系了,陌生的是runloop到底是个什么东西。去公司面试的时候,很多公司的面试人员会问这个问题。runloop的机制到底是什么?接下来慢慢看咯。
我2012年11月开始从事 iOS客户端开发,当时在青岛一家公司,研究生还没有毕业。我2014年4月正式入职一家互联网工作,很多大公司在招聘的时候,是以实际毕业时间来算工作经验的,所以有的时候很亏啊。不扯这些了,要知道runloop是什么,那得知道它跟线程之间是个啥关系,可以看下文章iOS中多线程原理与runloop介绍 来了解二者之间的关系。这篇文章就是个启蒙,说的简单。整篇文章谈到了以下内容:
进程与线程之间的关系。系统中的每一个进程都有自己独立的虚拟内存空间,而同一个进程中的多个线程则共用进程的内存空间。每创建一个新的线程,都需要一些内存(如每个线程有自己的Stack空间)和消耗一定的CPU时间。另外当多个线程对同一个资源出现争夺的时候需要注意线程安全问题。进程的执行单元时线程,一个进程中至少有一个线程,进程中必然存在一个主线程,所以在操作子线程的时候,不能阻塞主线程。当我们从网络上获取图片加载到 UIImageView 中的时候,如果使用同步加载数据,这条线程就会阻塞主线程,出现界面卡住了,用户不能操作UI界面了,要等到数据加载完成用户才能操作界面,滑动、返回、点击等操作。所以,加载网络数据的时候都是采用异步的方式来加载的,为了不影响UI界面的刷新,UI界面的刷新是在主线程进行的。
iOS中创建线程的方式。创建线程的方式有:NSThread、NSObject、POSIX thread、NSOperation(NSOperation &&NSOperationQueue)、 GCD(Grand Central Dispatch)。
进程间通信。进程间通信根线程间的通信有很多地方是类似的。
runloop。runloop普遍被翻译成运行循环,就是个线程中的循环的概念。在RunLoop中,需要处理的事件分两类,一种是输入源,一种是定时器,定时器好理解就是那些需要定时执行的操作,输入源分三类:performSelector源,基于端口(Mach port)的源,以及自定义的源。编程的时候可以添加自己的源。RunLoop还有一个观察者Observer的概念,可以往RunLoop中加入自己的观察者以便监控着RunLoop的运行过程。每一个线程都有其对应的RunLoop,但是默认非主线程的RunLoop是没有运行的,需要为RunLoop添加至少一个事件源,然后去run它。一般情况下我们是没有必要去启用线程的RunLoop的,除非你在一个单独的线程中需要长久的检测某个事件。
iOS中多线程原理与runloop介绍 这篇文章需要仔细看下,结合自己写过的代码一想,哦呵,以前好多细节没有注意到,有的概念根本就不知道。遇到问题,网上代码一搜,解决问题了,就这样吧,没有认真去总结、去追踪根源,这种做法确确实实把自己推向了码农的坑中,永远就是个搬砖的。
编程是门技术活,除了专业知识要牢固,语言的运用能力也不能差,什么语言?英语。iOS 中的大部门东西是国外的人研究比较透,而且苹果的iOS开发文档也是英文的。对于我们要快速掌握一个知识点,国内人苦心翻译的文稿那绝对不能不看,看中文肯定快啊。所以关于iOS多线程中的runloop机制,三篇翻译文章不得不看 IOS 多线程 RUNLOOP 机制 (一) 、IOS 多线程 RUNLOOP 机制 (二)、IOS 多线程 RUNLOOP 机制 (三)
还有一篇文章 iOS多线程编程指南(三)Run Loop也写的特别好,跟上面所提到的三篇文章有点类似,至于有什么看点,根据我看帖的经验,对一个知识点看不同的人反复解析,收获的东西肯定深刻,所以这篇经典的文章不容错过,要好好看看。
笔谈runloop(一)的更多相关文章
- RunLoop 总结:RunLoop的应用场景(一)
参考资料 好的书籍都是值得反复看的,那好的文章,好的资料也值得我们反复看.我们在不同的阶段来相同的文章或资料或书籍都能有不同的收获,那它就是好文章,好书籍,好资料.关于iOS 中的RunLoop资料非 ...
- 我的runloop学习笔记
前言:公司项目终于忙的差不多了,最近比较闲,想起叶大说过的iOS面试三把刀,GCD.runtime.runloop,runtime之前已经总结过了,GCD在另一篇博客里也做了一些小总结,今天准备把ru ...
- [tableView reloadData] 和 runloop
需要[tableView reloadData]后需要立即获取tableview的cell.高度,或者需要滚动tableview,那么,直接在reloadData后执行代码是会有问题的. 断点调试感觉 ...
- RunLoop 总结:RunLoop的应用场景(二)
上一篇讲了使用RunLoop保证子线程的长时间存活,而不是执行完任务后就立刻销毁的应用场景.这一篇就讲述一下RunLoop如何保证NSTimer在视图滑动时,依然能正常运转. 参考资料 好的书籍都是值 ...
- iOS多线程-RunLoop简介
什么是RunLoop? 从字面上来看是运行循环的意思. 内部就是一个do{}while循环,在这个循环里内部不断的处理各种任务(比如:source/timer/Observer) RunLoop的存在 ...
- RunLoop(基本操作)
基本概念 -(void)runTimerInThread { //NSAutoreleasePool,没的用 [NSTimer scheduledTimerWithTimeInterval:1.0 t ...
- RunLoop
一.什么是RunLoop 从字面意思理解:运行循环.跑圈. 基本作用: 保持程序(应用)的持续运行. 处理程序(APP)中的各种事件(比如:触摸事件.定时事件.Selector事件等) 节省CPU资源 ...
- iOS RunLoop简介
一.什么是RunLoop? RunLoop是运行循环,每个Cocoa应用程序都由一个处于阻塞状态的do/while循环驱动,当有事件发生时,就把事件分派给合适的监听器,如此反复直到循环停止.处理分派的 ...
- 深入理解RunLoop
网上看的一篇文章,写的真好,我得多看几次好好理解理解 膜拜大神,转载至此便于学习查看. 此处标明原文链接:http://blog.ibireme.com/2015/05/18/runloop/ ...
随机推荐
- -bash: /bin/grep: Argument list too long和 find: Arguments to -type should contain only one letter报错处理
由于要查找的文件太多 过滤成只找具体时间一天以内的文件 | 查找最近30分钟修改的当前目录下的.php文件 查找最近24小时修改的当前目录下的.php文件 查找最近24小时修改的当前目录下的.php文 ...
- MySQL8新特性(1)--原子DDL
mysql 8支持原子ddl.一个原子DDL语句包含数据字典更新.存储引擎操作.二进制日志写,事务要么被提交,应用修改被持持久化到数据字典.存储引擎和二进制日志,或者被回滚. 原子ddl是随着mysq ...
- Linux下打开超大文件的方法
Linux下打开超大文件方法 在Linux下用VIM打开大小几个G.甚至几十个G的文件时,是非常慢的. 这时,我们可以利用下面的方法分割文件,然后再打开. 1 查看文件的前多少行 head -1000 ...
- IDS,IPS,IPD
什么是IDP - 百度文库https://wenku.baidu.com/view/c500cf35eefdc8d376ee3220.html
- 《精通CSS第3版》(3)可见格式化模型+(4)网页排版
- odoo开发笔记 -- 模型后台方法返回前端form视图和tree视图的写法
待补充: 参考:工作单跳转到通关清单 --form(一对一) 工作单跳转到报关单列表 --tree (一对多)
- SpringBoot MAVEN编译报错Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.0:
参考了好几篇文章没搞定,直到查询错误关键字 An unknown compilation problem occurred 分别参考了以下博客: https://blog.csdn.net/fanre ...
- Jmeter里http接口的执行顺序是顺序执行
1,如果在一个线程组里则是顺序执行 2,如果不在一个线程组里,就勾选独立运行各个线程组,在一个运行结束后启动下一个线程组
- k8s记录-kubectl常用
kubectl create/delete -f xxx.yml kubectl get all -A kubectl get pods -o wide kubectl describe pods p ...
- [图片问答]lodop注册相关
相关博文:LODOP和C-LODOP注册与角色等简短问答[增强版]由于其他博文要么图片太花哨(PS做的所以太花哨),要么文字太啰嗦,所以做了简短问答的图片,更简洁直观方便.1.该购买哪种LODOP注册 ...