GCD (Grand Central Dispatch),在某些程序员中俗称之为“伟大的调度中心“。GCD 是苹果封装好的一个方法,它的底层仍然是用多线程实现的,不过便于程序猿的使用不必关注实现的细节。GCD存在于libdispatch.dylib 这个库中,整个库工程默认动态加载。
GCD 的优势:
1.CGD会自动利用更多的CPU内核(比如双核、四核)
2.GCD会自动管理线程的生命周期,无需程序猿手动操作(创建线程、调度任务、销毁线程)
3.便于程序猿的使用,只需要告知GCD需要执行的任务,不需要编写任何线程关联的代码
GCD 的使用:
1.队列,用来存放要执行的任务
2.任务,执行的操作
GCD中的FIFO(First In , First Out) 队列称为:dispatch queue ,它可以保证先进来的任务先得到执行,dispatch queue 有三种:
1.Serial dispatch queue (串行队列),同时只执行一个任务(一个任务执行完毕以后,再执行下一个任务),虽然各自是同步执行的,但每个Serial dispatch queue 之间是并发执行的。
2.Concurren dispatch queue(并发队列),即可以并发的执行多个任务(可以让多个任务同时执行,自动开启多个线程同时执行任务,并发功能只有在异步函数(dispatch_async) 下有效),但执行完成的顺序是随机的。
3.Main dispatch queue(主队列),是全局可用的serial queue (直接在主线程中串行执行任务),它是应用于主线程上的。
//
// ViewController.m
// GCD多线程的使用
//
// Created by webapps on 17/1/16.
// Copyright © 2017年 webapps. All rights reserved.
//
/*GCD ---> Grand Central Dispatch 俗称伟大的调度中心*/
#import "ViewController.h"
@interface ViewController ()
{
UIImageView *imageView;
}
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
imageView = [[UIImageView alloc]init];
imageView.frame = CGRectMake(50, 100, 100, 100);
imageView.contentMode = UIViewContentModeScaleAspectFit;
[self.view addSubview:imageView];
// 获取主队列
dispatch_queue_t MainQueue = dispatch_get_main_queue();
dispatch_async(MainQueue, ^{
NSLog(@"使用异步函数执行队列中任务1---%@",[NSThread currentThread]);
});
dispatch_async(MainQueue, ^{
NSLog(@"使用异步函数执行队列中任务2---%@",[NSThread currentThread]);
});
// 获取一个全局队列
/*
#define DISPATCH_QUEUE_PRIORITY_HIGH 2 优先级别高
#define DISPATCH_QUEUE_PRIORITY_DEFAULT 0 优先级别中
#define DISPATCH_QUEUE_PRIORITY_LOW (-2) 优先级别低
#define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN 后台
*/
dispatch_queue_t GlobalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(GlobalQueue, ^{
// 打印一下当前的线程
NSLog(@"当前的进程是哪个 :%@",[NSThread currentThread]);
/*wsqToop: 纯GCD方式 */
NSURL *imageUrl = [NSURL URLWithString:@"https://ss0.bdstatic.com/94oJfD_bAAcT8t7mm9GUKT-xh_/timg?image&quality=100&size=b4000_4000&sec=1484287073&di=df0b9e256cf9d6608728d83842f49817&src=http://d.hiphotos.baidu.com/image/pic/item/5882b2b7d0a20cf482c772bf73094b36acaf997f.jpg"];
NSData *imageData = [NSData dataWithContentsOfURL:imageUrl];
UIImage *image = [UIImage imageWithData:imageData];
// 回到主线程更新图片
dispatch_async(MainQueue, ^{
imageView.image = image;
});
// 另一种回到主线程方式刷新UI
[self downImage];
});
NSLog(@"xxxxxxxx :%@",[NSThread currentThread]);
}
/*wsqToop: GCD与NSThread*/
- (void)downImage{
NSURL *imageUrl = [NSURL URLWithString:@"https://ss0.bdstatic.com/94oJfD_bAAcT8t7mm9GUKT-xh_/timg?image&quality=100&size=b4000_4000&sec=1484287073&di=df0b9e256cf9d6608728d83842f49817&src=http://d.hiphotos.baidu.com/image/pic/item/5882b2b7d0a20cf482c772bf73094b36acaf997f.jpg"];
NSData *imageData = [NSData dataWithContentsOfURL:imageUrl];
UIImage *image = [UIImage imageWithData:imageData];
[self performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:NO];
}
- (void)setImage:(UIImage *)image{
imageView.image = image;
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end