iOS开发多线程之GCD程序员
iOS开发之GCD串行队列性能优化
iOS开发之GCD并发队列bash
什么是GCD网络
GCD的优点多线程
GCD的2个核心概念并发
GCD的使用就2个步骤异步
GCD会自动将==队列==中的==任务==取出,放到对应的==线程==中执行; 任务的取出遵循对象的==FIFO原则:先进先出,后进后出==async
==画图分析== 程序员要作的,将任务添加到队列;队列按照程序员指定的方式,调度任务。执行任务的方法:同步/异步 同步:一个任务没有结束,就不会执行下一个任务 异步:不用等待任务执行完毕,就会执行下一个任务函数
GCD有一个“线程池”;
图1:同步线程图例
图2:异步线程图例
在viewController 的touchBegain方法里去调用方法。[self gcdDemo1]
1.建立队列 2.添加任务到队列中 3.将任务添加到队列,而且会执行
写block的方法的窍门:写用函数的思路写出,太函数名前面加一个括号()和 尖尖符号,再在函数体外面的大括号{}前面加一个尖尖符号。
/*
同步执行方法,这句话不执行完,就不会执行下个任务,同步执行不会开启线程;
*/
-(void)gcdDemo1
{
//1.建立队列
dispatch_queue_t q = dispatch_get_global_queue(0,0);
//2.任务添加到队列中
//2.1定义任务--block
void (^task)() = ^{
NSLog(@"%@",[NSThread curresntThread]);
};
//2.2 添加任务到队列,而且会执行
dispatch_sync(q,task);
//合并步骤1,2步,省略写法
dispatch_sync(q,^{
NSLog(@"%@",[NSThread currentThread]);
});
}
复制代码
1.建立队列 2.添加任务到队列中 3.将任务添加到异步队列,而且会执行
异步执行,若是任务没有执行完毕,能够不用等待;异步执行下一个任务。具有开启线程的能力,异步一般又是多线程的代名词!
/*
异步任务
*/
-(void)gcdDemo2
{
//1.建立队列
dispatch_queue_t q = dispatch_get_global_queue(0,0);
//2.1定义任务--block
void (^task)() = ^{
NSLog(@"%@",[NSThread curresntThread]);
};
//2.2 添加任务到队列,而且会执行
dispatch_async(q,task);
}
复制代码
GCD之间的线程通信
-(void)gcdDemo3
{
//指定任务执行方法 -- 异步
dispatch_async(dispatch_get_global_queue(0,0),^{
//耗时操做
NSLog(@"%@",[NSThread currentThread]);
//更新UI
dispatch_async(dispatch_get_main_Queue(),^{
NSLog(@"更新UI%@",[NSThread currentThread]);
});
});
}
复制代码
==修改多线程demo 002--显示网络图片==
-(void)viewDidLoad
{
//代码集中,便于维护
//利用GCD获取网络图片
//异步执行
dispatch_async(dispatch_get_global_queue(0,0),^{
NSURL *url = [NSURL URLWithString:@"http://img3.utuku.china.com/395x0/news/20170629/35381bbe-6e16-4be1-8cf4-4af9107448b7.jpg"];
NSData *data = [NSData dataWithContentsOfURL:url];
UIImage *image = [UIImage imageWithData:data];
//更新UI
dispatch_async(dispatch_get_main_queue(),^{
self.imageView.image = image;
[self.imageView sizeToFit];
self.scrollView.contentSize = image.size;
});
//block没有循环引用,只是一个代码块,由于它没有做为属性,这里的block用完就释放了。
});
}
复制代码
原文做者:集才华美貌于一身的—C姐