swift 多线程及GCD

1、基本概念


1)进程:

进程是指在系统中正在运行的一个应用程序。每个进程之间是独立的,每个进程运行在其专用且受保护的内存空间里。某进程内的线程在其它进程不可见

2)线程:

1个进程要执行任务,必须有线程,每个进程必须至少拥有一个线程,线程是进程的基本执行单元,一个进程的所有任务都在线程中执行

3)多线程:

一个进程中可以开启多个线程,每个线程可以并行执行不同的任务

多线程并发及原理:并行即同时执行,比如同时开启三个线程分别下载3个文件。 在同一个时间里,CPU只能处理一条线程,只有1条线程在执行。多线程同时执行,其实是CPU快速的在多个线程之间进行切换,如果切换线程的时间足够快,就造成了多线程并发执行的假象

2、多线程在开发中的应用


在iOS的开发中为了提高程序的运行效率会把比较耗时的操作放在自线程中去执行,iOS系统进程默认会开启i一个主线程,用来响应用户的手势操作以及UI刷新,因此主线程又叫做UI线程

1)延迟执行

最简单粗暴的方式就是对线程本身执行挂起操作

 Thread .sleep(forTimeInterval: 2.0)

另外使用隐式创建开启线程的方法

 self .perform(#selector(doSomething), with: nil, afterDelay: 2.0)

使用GCD处理延迟操作

//        指定时间后执行
        DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 3.0) {
            print("after3.0!")
        }

2)只执行一次

swift3.0废弃了dispatch_once API,文档中只提示Use lazily initialized globals instead。但是看了这句话之后并不知道该怎么做,原来自从swift 1.x开始swift就已经开始用dispatch_one机制在后台支持线程安全的全局lazy初始化和静态属性.所以static var背后已经在使用dispatch_once了。

SO 我们在swift3.0中使用单例可以用以下几种方法:

1.。。。使用全局常量

let sb = SomeClass()

更多的内容以后再补充


3、DispatchQueue

Dispatch的全局函数不再是下划线的风格,也就是说他变成了一个更符合swift风格的DispatchQueue

首先来看一个基本的实现 注释都在代码里

   DispatchQueue.global().async {
            print("开始执行异步任务")
            Thread.sleep(forTimeInterval: 10)
            print("异步任务执行完毕")
            DispatchQueue.main.async {
                print("回到住线程刷新UI")
            }
        
        }

我们使用 DispatchQueue . global ( ) 获取一个系统的队列,这样的话获取的就是默认 . default 优先级的队列了,如果要获取其他优先级的队列,就使用 DispatchQueue. global ( qos : . userInitiated ) ,最后,我们使用 . async { } 来执行代码:

一共有四个优先级

.userInitiated

.default

.utility

.background

        DispatchQueue.global(qos: .background).async {
            print("这是一个系统阵列的优先级 代表")
        }

创建一个阵列

    let oneQueue = DispatchQueue.init(label: "一个傻逼一样的阵列")
        
        oneQueue.async {
           print("卧槽 我创建的这个阵列竟然活了")
        }
        

4、操作阵列

http://blog.csdn.net/jiandanjinxin/article/details/50555903 好累 不写了