iOS多线程简介 - Swift版本 1.多线程开发 -- CGD的简单使用
2015-05-02 13:09
357 查看
在我们实际开发中, 有难免会遇到一些问题, 比如我要从网上下载一张图片进行修改, 这里就涉及到线程的问题了, 还有就是我们平常使用的下载工具: 迅雷, QQ旋风之类的, 它们可以进行同时下载, 也可以一个一个的来下载, 在这里我们称之为同步和异步, 顾名思义, 所谓的同步就是所有文件一起下载, 异步就是把需要下载的文件一个个排好队来下载.
进程: 正在进行中的程序就叫做进程, 负责程序运行的内存分配, 每一个进程都有自己独立的虚拟内存空间.
线程: 线程是进程中一个独立的执行路径(控制单元), 一个进程中至少包含一条线程(主线程), 可以将耗时的操作或者执行放到另一个线程里.
说白了, 进程就是为程序分配内存的, 而线程就是用来控制程序代码的实际运行.
举个例子, 我们的程序运行, 都是按照代码从上往下的执行, 但如果遇到需要下载图片的时候, 它就会卡在这里, 等待图片下载完成才会执行下一步, 这样子就不符合我们的实际体验了, 所以我们会把下载图片放到子线程里去操作, 等到下载完成之后才传回给主线程, 这就是多线程的好处, 既不会影响主线程的运行, 又可以完成下载图片的任务.
提示:
1.dispatch_async 异步操作,会并发执⾏,无法确定任务的执⾏顺序
2.dispatch_sync 同步操作,会依次顺序执⾏,能够决定任务的执行顺序
PS: 线程是有限的, 不可以无休止的增加, 而主线程的大小只有1MB, 子线程都是512KB.
并行队列: 队列中的任务通常会并发执⾏
全局队列
主线程队列
1.同步任务, 不需要新建线程, 异步任务, 需要⼀个⼦线程, 线程的创建和回收不需要程序员参与!
2.“是最安全的一个选择”串⾏行队列只能创建!
并行队列
1.同步任务, 不需要创建线程并行队列, 异步任务, 有多少个任务, 就开N个线程执⾏行 无论什么队列和什么任务, 线程的创建和回收不需要程序员参与.
2.线程的创建回收⼯作是由队列负责的 “并发”编程, 为了让程序员从负责的线程控制中解脱出来! 只需要⾯对队列和任务!
GCD的好处
1.通过GCD, 开发者不⽤再直接跟线程打交道, 只需要向队列中添加代码块即可.
2.GCD在后端管理着⼀个线程池, GCD不仅决定着代码块将在哪个线程被执⾏, 它还根据可用的系统资源对这些线程进⾏管理. 从而让开发者从线程管理的工作中解放出来, 通过集中的管理线程, 缓解大量线程被创建的问题.
3.使⽤用GCD, 开发者可以将工作考虑为一个队列, 而不是一堆线程,这种并行的抽象模型更容易掌握和使⽤.
GCD的队列
1.GCD公开有5个不同的队列: 运⾏在主线程中的主队列, 3个不同优先级的后台队列, 以及一个优先级更低的后台队列(⽤于 I/O).
2.⾃定义队列: 串⾏行和并⾏行队列, ⾃定义队列⾮常强大,建议在开发中使⽤, 在⾃定义队列中被调度的所有Block最终都将被放⼊到系统的全局队列中和线程池中.
提示: 不建议使⽤用不同优先级的队列, 因为如果设计不当, 可能会出现优先级反转, 即低优先级的操作阻塞⾼优先级的操作.
好了, 这次我们就讲到这里, 下次我们继续~~
1.基本概念
在开始说多线程之前, 我们要知道两样东西, 一个是进程, 一个是线程:进程: 正在进行中的程序就叫做进程, 负责程序运行的内存分配, 每一个进程都有自己独立的虚拟内存空间.
线程: 线程是进程中一个独立的执行路径(控制单元), 一个进程中至少包含一条线程(主线程), 可以将耗时的操作或者执行放到另一个线程里.
说白了, 进程就是为程序分配内存的, 而线程就是用来控制程序代码的实际运行.
举个例子, 我们的程序运行, 都是按照代码从上往下的执行, 但如果遇到需要下载图片的时候, 它就会卡在这里, 等待图片下载完成才会执行下一步, 这样子就不符合我们的实际体验了, 所以我们会把下载图片放到子线程里去操作, 等到下载完成之后才传回给主线程, 这就是多线程的好处, 既不会影响主线程的运行, 又可以完成下载图片的任务.
提示:
1.dispatch_async 异步操作,会并发执⾏,无法确定任务的执⾏顺序
2.dispatch_sync 同步操作,会依次顺序执⾏,能够决定任务的执行顺序
PS: 线程是有限的, 不可以无休止的增加, 而主线程的大小只有1MB, 子线程都是512KB.
2.GCD队列
串行队列: 队列中的任务只会顺序执⾏func gcdDemo1() { // 将操作放在队列中 // 在 C 语言函数中, 定义类型, 绝大多数都是以_t或者ref 结尾 // 使用串行队列的异步任务, 可以节省资源, 新建线程是需要有资源消耗的, 不能无休止的去新建线程 // 应用案例: // 从网上下载图片 // 滤镜(高光, 红眼...) var q: dispatch_queue_t = dispatch_queue_create("com.cain.gcdDemo1", DISPATCH_QUEUE_SERIAL) let i = 0 for i in 0...10 { dispatch_async(q, { () -> Void in println(NSThread.currentThread()) }) } // 非 ARC 开发时, 一定要 release // dispatch_release(q); // 串行队列的同步任务, 也会在主线程中运行 // 在实际开发中, 极少人用 // 面试又可能会用到 for i in 0...9 { // 同步任务, 顺序执行 dispatch_async(q, { () -> Void in println("\(NSThread.currentThread()) - \(i)") }) } }
并行队列: 队列中的任务通常会并发执⾏
func gcdDemo2() { // 特点: 没有顺序, 程序员不可控 // 应用场景: 并发执行的, 没有先后顺序 // 并行队列容易出错, 并行队列创建的子线程数量同样是不可控 var q: dispatch_queue_t = dispatch_queue_create("com.cain.gcdDemo2", DISPATCH_QUEUE_CONCURRENT) for i in 0...9 { // 同步任务 dispatch_sync(q, { () -> Void in println("\(NSThread.currentThread()) - \(i)") }) // 异步任务 dispatch_async(q, { () -> Void in // [NSThread currentThread] 可以在开发中跟踪当前的线程. // number = 1表示主线程 // number = 2或者其他, 表示子线程, 这里是2, 所以是第2个子线程 println("\(NSThread.currentThread()) - \(i)") }) } }
全局队列
func gcdDemo3() { // 全局队列与并行队列的区别 // 1< 不需要创建, 直接GET就可以使用 // 2< 两个队列的执行效果相同 // 3< 全局队列没有名称, 调试时无法确认准确队列 var q: dispatch_queue_t = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) for i in 0...9 { // 异步任务 dispatch_async(q, { () -> Void in println("\(NSThread.currentThread()) - \(i)") }) // 同步任务 dispatch_sync(q, { () -> Void in println("\(NSThread.currentThread()) - \(i)") }) } }
主线程队列
func gcdDemo4() { var q = dispatch_get_main_queue() for i in 0...9 { // 异步任务, 并发执行, 保持队形的 dispatch_async(q, { () -> Void in println("\(NSThread.currentThread()) - \(i)") }); // 同步任务 // 注意, 在主线程队列中不可以使用同步任务, 否则会造成线程阻塞 // dispatch_sync(q, { () -> Void in // println("come here baby!") // }); } }
3.GCD总结
串⾏队列1.同步任务, 不需要新建线程, 异步任务, 需要⼀个⼦线程, 线程的创建和回收不需要程序员参与!
2.“是最安全的一个选择”串⾏行队列只能创建!
并行队列
1.同步任务, 不需要创建线程并行队列, 异步任务, 有多少个任务, 就开N个线程执⾏行 无论什么队列和什么任务, 线程的创建和回收不需要程序员参与.
2.线程的创建回收⼯作是由队列负责的 “并发”编程, 为了让程序员从负责的线程控制中解脱出来! 只需要⾯对队列和任务!
GCD的好处
1.通过GCD, 开发者不⽤再直接跟线程打交道, 只需要向队列中添加代码块即可.
2.GCD在后端管理着⼀个线程池, GCD不仅决定着代码块将在哪个线程被执⾏, 它还根据可用的系统资源对这些线程进⾏管理. 从而让开发者从线程管理的工作中解放出来, 通过集中的管理线程, 缓解大量线程被创建的问题.
3.使⽤用GCD, 开发者可以将工作考虑为一个队列, 而不是一堆线程,这种并行的抽象模型更容易掌握和使⽤.
GCD的队列
1.GCD公开有5个不同的队列: 运⾏在主线程中的主队列, 3个不同优先级的后台队列, 以及一个优先级更低的后台队列(⽤于 I/O).
2.⾃定义队列: 串⾏行和并⾏行队列, ⾃定义队列⾮常强大,建议在开发中使⽤, 在⾃定义队列中被调度的所有Block最终都将被放⼊到系统的全局队列中和线程池中.
提示: 不建议使⽤用不同优先级的队列, 因为如果设计不当, 可能会出现优先级反转, 即低优先级的操作阻塞⾼优先级的操作.
好了, 这次我们就讲到这里, 下次我们继续~~
相关文章推荐
- iOS多线程简介 - Swift版本 2.多线程开发 -- NSOperation的简单使用
- 简介 WatiN是一个开源的用于Web测试自动化的类库,从watir中获得的灵感,使用C#开发。WatiN通过与浏览器的交互来实现自动化,使用起来具有轻便,简单的特点。目前最新版本为2.0,加入了对
- iOS多线程简介 - Swift版本 3.多线程开发 -- Run Loop
- iOS开发之多线程-- NSOperation使用简介(个人笔记)
- 百度编辑器UEEDITOR使用简单介绍 UEditor表单提交和后台交互详解 最后更新对应的版本:1.2.5.1 教程描述: 富文本编辑器的使用开发中,表单提交有多种场景,编辑器初始化有新增文章和编辑
- [iOS开发]使用Swift检测系统版本信息
- iOS开发:Swift多线程GCD的使用
- IOS开发日志之CocoaPod的安装与简单使用Xcode7.2版本
- iOS开发多线程---GCD的介绍和简单使用
- XNA Game Studio是一套有着强大功能和简单界面的游戏制作平台,游戏开发商和游戏玩家都可以使用这套工具开发针对Windows XP以及Xbox360的游戏,XNA Game Studio分为两种版本,一种是面向初学者的EXPRESS版本,还有一种
- XNA Game Studio是一套有着强大功能和简单界面的游戏制作平台,游戏开发商和游戏玩家都可以使用这套工具开发针对Windows XP以及Xbox360的游戏,XNA Game Studio分为两种版本,一种是面向初学者的EXPRESS版本,还有一种是面向专业用户的专业版。用户使用EXPRESS版本开发游戏完全免费,并且可以随意在PC上发行,不过用该工具开发的游戏若是在360上网络发行,就需要交纳99美元的年费。
- swift开发多线程篇 - NSThread 线程相关简单说明(一些使用和注意点)
- android开发利器Data Binding简介和简单使用(已支持双向绑定)
- 如何使用 Swift 开发简单的条形码检测器?
- 如何使用 Swift 开发简单的条形码检测器?
- iOS开发中大部分App的网络数据交换是基于HTTP协议的。本文将简单介绍在Swift中使用HTTP进行网络请求的几种方法。
- iOS开发进阶 - 日志输出框架CocoaLumberjack与XcodeColors插件的简单使用(swift版)
- iOS开发进阶 - 日志输出框架CocoaLumberjack与XcodeColors插件的简单使用(swift版)
- 使用C++11让多线程开发变得简单
- iOS开发,3DTouch(swift版本)的使用