//
// ViewController.swift
// GCD
//
// Created by admin on 16/2/22.
// Copyright © 2016年 jin. All rights reserved.
//
import UIKit
class ViewController: UIViewController {
/**
概念
任务:闭包
队列:存放任务,先进先出的原则
串行队列:任务一个一个顺序执行
并发队列:同时取出多个任务
同步sync:不会开辟新线程
异步async:会开新线程
串行队列同步执行:不开线程,在原来的线程里面顺序执行
串行队列异步执行:开一条线程,在新线程里面顺序执行
并发队列同步执行:不开线程,在原来线程顺序执行
并发队列异步执行:开多条线程,在开辟的新线程里面执行
总结
1.是否sync决定是否开辟新任务
2.开多少线程由队列决定,串行最多开一个,并发可以开多个,有GCD底层决定
*/
@IBOutlet weak var imageView: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
}
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
self.gcdL()
}
// 定义once变量
static var once = dispatch_once_t()
func gcdL()
{
print(ViewController.once)// 第一次打印 0
dispatch_once(&ViewController.once) { () -> Void in
print("只执行一次")
}
print(ViewController.once)// 打印 -1
print("ok")
}
// 组队列
func gcdK()
{
let queueGroup = dispatch_group_create()
let queue = dispatch_queue_create("queue", DISPATCH_QUEUE_CONCURRENT)
dispatch_group_async(queueGroup, queue) { () -> Void in
print(NSThread.currentThread())
print("下载a")
}
dispatch_group_async(queueGroup, queue) { () -> Void in
print(NSThread.currentThread())
print("下载b")
}
dispatch_group_async(queueGroup, queue) { () -> Void in
print(NSThread.currentThread())
print("下载c")
}
// 队列里面的所有任务执行完毕之后执行,可以跨队列通信
dispatch_group_notify(queueGroup, dispatch_get_main_queue()) { () -> Void in
print(NSThread.currentThread())
print("下载完毕")
}
}
// 延迟执行
func gcdJ()
{
let time = dispatch_time(DISPATCH_TIME_NOW, (Int64)(2 * NSEC_PER_SEC))
/**
第一个参数:表示从现在开始经过多少纳秒之后
第二个参数:在哪个队列中执行
*/
dispatch_after(time, dispatch_get_main_queue()) { () -> Void in
print(NSThread.currentThread())
}
}
// GCD线程间通信
func gcdI()
{
dispatch_async(dispatch_get_global_queue(0, 0)) { () -> Void in
let data = NSData(contentsOfURL: NSURL(string: "http://e.hiphotos.baidu.com/image/pic/item/29381f30e924b8995d7368d66a061d950b7bf695.jpg")!)
let image = UIImage(data: data!)
print(NSThread.currentThread())
dispatch_sync(dispatch_get_main_queue(), { () -> Void in
print(NSThread.currentThread())
self.imageView.image = image
})
}
}
func gcdH()
{
let queue = dispatch_get_global_queue(0, 0)
for var i = 0;i < 10;i++
{
print("主队列")
dispatch_async(queue) { () -> Void in
print(NSThread.currentThread())
}
}
}
/**
全局队列跟并发队列的区别
1. 全局队列没有名称 并发队列有名称
2. 全局队列,是供所有的应用程序共享。
3. 在MRC开发,并发队列,创建完了,需要释放。 全局队列不需要我们管理
*/
func gcdG()
{
/**
参数:第一个参数,一般 写 0(可以适配 iOS 7 & 8)
iOS 7
DISPATCH_QUEUE_PRIORITY_HIGH 2 高优先级
DISPATCH_QUEUE_PRIORITY_DEFAULT 0 默认优先级
DISPATCH_QUEUE_PRIORITY_LOW (-2) 低优先级
DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN 后台优先级
iOS 8
QOS_CLASS_DEFAULT 0
第二个参数:保留参数 0
*/
let queue = dispatch_get_global_queue(0, 0)
for var i = 0;i < 10;i++
{
print("主队列")
dispatch_sync(queue) { () -> Void in
print(NSThread.currentThread())
}
}
}
// 主队列异步
func gcdF()
{
let queue = dispatch_get_main_queue()
for var i = 0;i < 10;i++
{
print("主队列")
dispatch_async(queue) { () -> Void in
print(NSThread.currentThread())
}
}
}
/**
主队列:专门负责在主线程上调度任务,不会在子线程调度任务,在主队列不允许开新线程.
同步执行:要马上执行
结果:死锁
*/
func gcdE()
{
// 1. 获得主队列-> 程序启动,--> 至少有一个主线程-> 一开始就会创建主队列
let queue = dispatch_get_main_queue()
for var i = 0;i < 10;i++
{
print("主队列")
// 同步:把任务放到主队列里,但需是马上执行
dispatch_sync(queue) { () -> Void in
print(NSThread.currentThread())
}
}
}
/**
并发队列:可以同时执行多个任务
异步执行:肯定会开新线程,在新线程执行
结果:会开很多个线程,同时执行
*/
func gcdD()
{
let queue = dispatch_queue_create("queue",DISPATCH_QUEUE_CONCURRENT)
for var i = 0;i < 10;i++
{
dispatch_async(queue) { () -> Void in
print(NSThread.currentThread())
}
}
}
/**
并发队列:可以同时执行多个任务
同步任务:不会开辟新线程,是在当前线程执行
结果:不开新线程,顺序一个一个执行。
*/
func gcdC()
{
let queue = dispatch_queue_create("queue", DISPATCH_QUEUE_CONCURRENT)
for var i = 0;i < 10;i++
{
dispatch_sync(queue) { () -> Void in
print(NSThread.currentThread())
}
}
}
/**
串行队列:一个一个执行
异步执行:肯定会开新线程,在新线程执行
结果:只会开一个线程,而且所有任务都在这个新的线程里面执行
*/
func gcdB()
{
let queue = dispatch_queue_create("queue", DISPATCH_QUEUE_SERIAL)
for var i = 0;i < 10;i++
{
dispatch_async(queue) { () -> Void in
print(NSThread.currentThread())
}
}
}
/**
串行队列:顺序,一个一个执行
同步任务:不会开辟新线程,是在当前线程执行
结果:不开新线程,在当前线程顺序执行
dispatch : 调度,GCD里面函数,都是以dispatch开头的
*/
func gcdA()
{
let queue = dispatch_queue_create("queue", nil)
dispatch_sync(queue) { () -> Void in
print(NSThread.currentThread())
}
}
}