GCD多线程2

来源:互联网 发布:moe域名注册 编辑:程序博客网 时间:2024/06/04 18:50

一、主队列:是和主线程相关联的队列,主队列是GCD自带的一种特殊的串行队列,放在主队列中得任务,都会放到主线程中执行。
如果把任务放到主队列中进行处理,那么不论处理函数是异步的还是同步的都不会开启新的线程。

(1)使用异步函数执行主队列中的任务

- (void)viewDidLoad {    [super viewDidLoad];    // Do any additional setup after loading the view, typically from a nib.    NSLog(@"%@",[NSThread mainThread]);    dispatch_queue_t mainQueue = dispatch_get_main_queue();    dispatch_async(mainQueue, ^{        NSLog(@"使用异步函数执行主队列中的任务1--%@",[NSThread currentThread]);    });dispatch_async(mainQueue, ^{    NSLog(@"使用异步函数执行主队列中的任务2--%@",[NSThread currentThread]);});    dispatch_async(mainQueue, ^{        NSLog(@"使用异步函数执行主队列中的任务3--%@",[NSThread currentThread]);    });}

打印结果:
这里写图片描述

(2)使用同步函数,在主线程中执行主队列中的任务,会发生死循环

二、
1、任务1单独开启一个新的线程,任务2在主线程执行。

- (void)viewDidLoad {       [super viewDidLoad];        //开启一个后台线程,调用执行test方法         [self performSelectorInBackground:@selector(test) withObject:nil];     } -(void)test {        NSLog(@"当前线程---%@",[NSThread currentThread]);         dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);         //异步函数         dispatch_async(queue, ^{                 NSLog(@"任务1所在的线程----%@",[NSThread currentThread]);             });         //同步函数         dispatch_sync(queue, ^{                 NSLog(@"任务2所在的线程----%@",[NSThread currentThread]);             });     }

打印结果:这里写图片描述

2.在子线程加载图片完毕后,主线程拿到加载的image刷新UI界面

- (void)viewDidLoad {       [super viewDidLoad]; }-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {        //1.获取一个全局串行队列         dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);         //2.把任务添加到队列中执行         dispatch_async(queue, ^{                 //打印当前线程                 NSLog(@"%@",[NSThread currentThread]);               //3.从网络上下载图片                 NSURL *urlstr=[NSURL URLWithString:@"http://upload.ct.youth.cn/2015/0608/1433725303485.jpg"];                 NSData *data=[NSData dataWithContentsOfURL:urlstr];                 UIImage *image=[UIImage imageWithData:data];                 //提示                 NSLog(@"图片加载完毕");                 dispatch_async(dispatch_get_main_queue(), ^{                     self.imageView.image = image;                     //打印当前线程                    NSLog(@"%@",[NSThread currentThread]);                 });             });    }

这里写图片描述

0 0
原创粉丝点击