GCD 是Grand Central Dispatch 的简称,这是对多核编程的较新的解决方案,主要用于优化应用程序来支持多核处理器以及其他对称系统。
GCD提供了一种很简单的操作方式来实现并行处理,可以把并行的代码放在一个block中,然后吧一个block加入一个queque中。
GCD中提供了3中种队列:
1.Main:这个队列顺序地执行我们的block,并保证这些block都在主线程中执行。
2.Concurrent:这个队列会遵循FIFO的原则来执行其中的block,自动为你管理你的线程;
3.Serial:队列每次执行一个block,也遵循FIFO的规则。
GCD的基本使用,创建一个队列,(非主线程的队列)将比较耗时的工作以block的形式放入到该队列当中执行,以避免主线程阻塞,而注意要在主线程哪里修改UI;
dispath_queue_t queue=dispath_get_global_queue(0,0);
dispath_async(queue,
^{
for(int i=0;i<100;i++)
{
[NStread sleepForTimeInterval:0.02];
//在主线程中更新内容
dispatch_async(dispatch_get_main_queue(),^{
self.progressView.progress +=0.01;
});
}
});
CGD的其他使用方式
并发多线程的使用的情况:
dispatch_queue_t queue=dispatch_get_global+global_queue(0,0);
dispatch_async(queue,^{
NSString *str1=[self doWork1];
dispatch_async(dispatch_get_main_queue(),^{
self.textView.text=[self.textView.text stringByAppendingFormat:@"%@\r\n",str1]; });
});
dispatch_async(queue,^{
NSString *str2=[self doWork1];
dispatch_async(dispatch_get_main_queue(),^{
self.textView.text=[self.textView.text stringByAppendingFormat:@"%@\r\n",str12]; });
});
dispatch_async(queue,^{
NSString *str3=[self doWork1];
dispatch_async(dispatch_get_main_queue(),^{
self.textView.text=[self.textView.text stringByAppendingFormat:@"%@\r\n",str13]; });
});
首先要创建一个Concurrent类型的队列,然后分别将要并发处理的block添加到这个队列当中。
分派组的使用:
NSMutableString *totalString=[NSMutableString alloc]initWithCapcity:10];
//创建一个队列组
dispatch_group_t group=diapatch_group_create();
//创建队列
dispatch_queue_t queue=dispatch_get_global+global_queue(0,0);
// 创建一个队列组 组名 队列名 执行的代码块
dispatch_groupp_async(group,queue,^{
NSString*str1=[self doWork1];
[totalString appendString:str1];
});
dispatch_groupp_async(group,queue,^{
NSString*str2=[self doWork2];
[totalString appendString:str2];
});
dispatch_groupp_async(group,queue,^{
NSString*str3=[self doWork3];
[totalString appendString:str3];
});
//以上的程序会异步执行,最后才执行一下一句代码来改变textView的文本内容;
diapatch_group_notify(group,dispatch_get_main_queue(),^{
self.textView.text=totalString;
});
使用GCD实现列表的异步加载图片
一以下我提供答题 的思路来实现图片的异步加载
1.我要定义一个储存图片的链接的数组并且把储存好所有的图片链接;
2.定义一个可变的储存在网络上下载的图片的可变数组;
3.定义一个相对应每一张图片的标志。
4. 定义一张默认的图片;
5.定义tableview并实现代理;
6.在代理的-(UItableviewcell*)tableview:(UItableview*)tableviewcellForRowAtINdexPath:(NSIndexPath*)indexPath;方法里面来执行调用
dispath_queue_t queue=dispath_get_global_queue(0,0);
dispath_async(queue,
^{
网络链接并且拿到图片
[NStread sleepForTimeInterval:0.02];
//在主线程中更新内容
dispatch_async(dispatch_get_main_queue(),^{
在这里更新UItablevie的列表
});
}
});
以上大体实现异步多线程下载图片的大体的布置,接下来就是你们自己编写,其实思想明白编写就很简单了。