说到Grand Central Dispatch,同步异步+串行并发开始的时候搞的我一头雾水。今天以具体的下载图片的例子来跟大家分享我的理解。
下载图片的功能需求:
1.不在Main Thread中完成下载图片的任务;
2.下载任务完成时在Main Thread中展示图片;
代码如下
-(void)buttonAction:(UIButton*)sender{
NSLog(@"主任务A");
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSLog(@"下载任务");
//dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)获取并发队列
NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://2f.zol-img.com.cn/product/153/509/ce7f5KSOeEcC6.jpg"]];
//这里暂停,直到完成下载为止
dispatch_async(dispatch_get_main_queue(), ^{
//dispatch_get_main_queue()获取主队列
[sender setImage:[UIImage imageWithData:imageData] forState:(UIControlStateNormal)];
NSLog(@"主任务B");
});
});
sender.backgroundColor = [UIColor greenColor];
NSLog(@"主任务C");
}
运行结果
整个的流程大概是这样子的
任务未开始 任务A 下载任务,在新的Thread中开始下载任务 Main Queue中加入C任务,Main Thread中开始C任务,现有两个thread在工作 Main Queue中加入B任务,Other Thread等待系统回收
结论:这里便有了两种常用的搭配
1.async+global_queue:耗时的任务都可以放在里面处理;
2.async+main_queue:完成任务后回到主线程操作UI;
网友评论