转:iOS开发者经常用到的多线程都有啥?

转:http://www.elsyy.com/news/2014/1124/6812140770.html

iOS开发中的多线程,无疑是个很重要的知识点,要想把握多线程这块,就要学会以下这些。

一、进程
在移动端,一个app就是一个进程,在内存中占用一定的空间。
在计算机里,一个程序就是一个进程,同样也占用内存空间。
iOS同一时间点只有一个进程在使用CPU,只是系统把这个时间片分割地非常短,造成一种多个进程同时在执行的假象。

二、线程
一个进程的执行,必然从一个主线程开始。整个应用可以由单个主线程运行,但是涉及到一些耗时的任务,例如打开淘宝app,必然要加载一大堆的图片。
这时,如果只有单线程执行,程序必须等着图片都加载完毕才能继续往下执行,期间用户的交互就不起作用,这样用户体验很不好。
所以,这时就衍生出多线程的概念,可以开子线程给那些耗时的任务,在旁边默默地执行,而不影响应用的大局。
主线程,一般用来处理主体的展示(例如控制器的切换)和交互事件。
子线程,一般用来处理耗时的任务。当然,并不是线程越多越好,多线程的使用也是要慎重考虑。

三、同步和异步
我之前一直对同步和异步这个概念理解不清,常常混淆。同步是线程安全呢,还是异步线程安全呢?
今天终于记清楚了这个概念,只要记住一句话——同步,就是同类;异步,就是异类。已经是同类,那肯定是处于同一个线程;异类,那就说明不是一个线程。

四、并行和串行
并行:并发执行
串行:按顺序执行,一个接一个

五、三种常用创建多线程方式
1.NSThread:程序员手动管理线程,而多线程的情况下,线程什么时候执行完毕是未知的,如果管理不好,会造成内存泄露,所以这种方法不提倡。
2.NSOperation\NSOperationQueue。这两个类必须是搭配使用的,将操作放入操作队列中,依次执行。
使用步骤:创建NSOperation;添加NSOperation到NSOperationQueue
优点:更加面向对象;可以控制最大并发数 maxConcurrentOperationCount,使用这个属性可以保证同一时间内最大的并发数;添加任务(Operation)之间的依赖 addDependency,使用这个属性可以控制一个Operation必须在其依赖的Operation执行完毕后才调用。

3.GCD(官方推荐使用,纯C语言)
调用同步(异步)执行的方法,传入要并行(串行)执行的队列参数,执行方法内的block代码。说白了就是同一时间有一个还是多个线程执行,就看调用的方法和传入的队列类型。
队列类型:
全局队列:所有添加到全局队列中的任务都是并发执行(同时执行,可能会开启多个线程)
串行队列:所有添加到串行队列中的任务都是按顺序执行(开一条线程)
主队列:所有添加到主队列中的任务都是在主线程中执行的(跟方法名没有关系)
同步还是异步,取决于方法名(不影响主队列,影响全局队列、串行队列)
同步:dispatch_sync,在当前线程执行任务,不会开启新的线程
异步:dispatch_async,在其他线程执行任务,会开启新的线程
代码demo演示:从组合学上说,总是共有四种情况:串行-同步、串行-异步、并行-同步、并行-异步。
串行-同步:显然一直只有一个线程在执行(这个就是真正意义上单线程)
串行-异步:可能会产生多个线程,但是同一时间只有一个线程在执行(异步虽然会产生多个不同线程,但是同一时间只有一个线程在执行)
并行-同步:同一时间点有多个相同的线程在执行
并行-异步:同一时间有多个不同的线程在执行(这是真正意义上的多线程)

下面就只举两个例子,剩下的2种情况举一反三就是了

而主队列的使用,常常用来执行完子线程后,要讲数据返回主线程来进行处理。比如开启子线程下载某个资源,下载完毕需要回调到主线程来展示。可以在子线程完成的时候调用以下的方法返回主线程,同时能够将子线程得到的参数传给处理的selector方法里执行。

4、开启后台线程

更多关于移动互联网开发的知识,大家不妨到良师益友网来学习视频教程。

时间: 2024-10-10 23:31:30

转:iOS开发者经常用到的多线程都有啥?的相关文章

国内90%以上的 iOS 开发者,对 APNs 的认识都是错的

转:http://toutiao.com/a6276578687162040578/?tt_from=weixin&utm_campaign=client_share&app=news_article&utm_source=weixin&iid=4155521039&utm_medium=toutiao_android&wxshare_count=1 本文为投稿文章,作者:iOS程序犭袁 (博客) 前言: APNs 协议在近两年的 WWDC 上改过两次,20

iOS开发者必备并发编程技巧

在iOS并发编程中经常会遇到一些问题,我们在这里并不探究 NSThread . GCD . NSOperation . NSOperationQueue 的具体用法,只探讨一些容易被遗忘的小点.希望对广大iOS开发者能够起到一定的帮助. 线程成本 维基百科上对线程的解释是: A thread of execution is the smallest sequence of programmed instructions that can be managed independently by a

取精华、去糟粕!适合iOS开发者的15大网站推荐

iOS开发者若想使技艺达到炉火纯青的地步,就要不断借鉴他人的有益经验,紧跟新兴科技和工具的步伐.除了Apple的开发者中心,其他网站上的文章和资源也具备参考价值,若能学得一二,必能锦上添花.不过,时间宝贵,开发者应具备取精华.去糟粕的眼力,这样才能事半功倍.本文推荐的博客和网站都是经过作者James Tang详细了解的,绝对不容错过. 原创博客大推荐 1. objc.io objc.io的文章质量上佳.观点深刻.针对性强,均出自世界顶级iOS工程师之手,按月更新.除此之外,Chris Eidho

iOS开发者必备:自己总结的iOS、mac开源项目及库

UI 下拉刷新 EGOTableViewPullRefresh - 最早的下拉刷新控件. SVPullToRefresh - 下拉刷新控件. MJRefresh - 仅需一行代码就可以为UITableView或者CollectionView加上下拉刷新或者上拉刷新功能.可以自定义上下拉刷新的文字说明.具体使用看“使用方法”. (国人写) XHRefreshControl - XHRefreshControl 是一款高扩展性.低耦合度的下拉刷新.上提加载更多的组件.(国人写) CBStoreHou

一个iOS开发者的修真之路

在微信上有童鞋问我iOS开发者的入门标准是神马?这个问题难到我了,而且贸然给一个答案出来的话,必定会有万千高手来喷. 凡人修仙,仙人修道,道人修真.当我们还是一个在青石板上蹲马步汗水涔涔的废柴时,或许天空中偶尔会有御剑飞行的仙人路过.金色的阳光洒在仙人随风舞动的剑穗上,此时不禁会油然而生一种冲动,希望有一天能成为这样的高手,自由飞翔.只是路漫漫其修远兮,漫漫修真路,从一个后天废柴到羽化升仙成为大神需要太多的努力. 我个人还属于iOS开发的外门弟子,正在入门的门槛上,所以还是一起来看看iOS开发内

打造最受企业欢迎的iOS开发者: 一直都存在的问题,什么样的员工最受企业欢迎? 一直也有人在努力

打造最受企业欢迎的iOS开发者: 一直都存在的问题,什么样的员工最受企业欢迎? 一直也有人在努力提升自己,成为受企业欢迎的员工 然而,我们应该往方向去提升自己呢? 88家知名企业今年来iOS面试题合集: 你要的这里都有: 企业要的这里也有: 从基础开始到进阶.深入底层 整理出188个大纲,干货太足 每个题目都会有相对的答案,由于字数太多所以我整理出一个文档,文档获取地址,加入iOS开发交流群:659170228免费获取.打造最受企业欢迎的iOS开发者 大纲展示: 1.swift和oc的区别 2.

iOS开发者程序许可协议

请仔细阅读下面的许可协议条款和条件之前下载或使用苹果软件.   这些条款和条件构成你和苹果之间的法律协议. 目的 你想使用苹果软件(如下定义)来开发一个或多个应用程序(如下定义)Apple-branded产品运行iOS. 苹果愿意授予您有限的许可使用苹果软件开发和测试您的应用程序在本协议规定的条款和条件. 开发的应用程序在此协议下可以分布在四个方面:(1)通过应用程序商店,如果选择苹果,(2)通过VPP / B2B项目网站,如果选择苹果,(3)在一个有限的基础上使用注册设备(如下定义),和(4)

麦子学院干货 | iOS开发者需要的九大设计工具

麦子学院[www.maiziedu.com]干货 | iOS开发者需要的九大设计工具 1.AppCooker AppCooker是一款方便的iPad应用.它能够提供可点击的原型模板,集合了所有需要编码或渲染的重要部件,并且还可以帮助开发者无需任何代码编写就能够构思.设计和测试iOS应用.目前AppCooker在App Store上的售价为19.99美元. 主要功能: 全功能模型编辑器拥有所有iOS UI部件 位图图画.矢量形状和文本工具 带有链接的整体屏幕视图 收存箱和Box支持云服务 2.Sk

iOS 开发者旅途中的指南针 - LLDB 调试技术

文章转载于:iOS 开发者旅途中的指南针 - LLDB 调试技术 今天给大家介绍的内容,无关乎任何功能性开发技术,但又对开发的效率影响至深,这就是调试技术. 何为调试呢,比如我们用 print 函数在指定位置进行输出,来定位某些节点的变量内的取值: 12345 let result = parseJSON("[1,2,3]");print(result); result = parseJSON("error");print(result);4 相信我们大家看到类似这