iOS的GCD怎么样实现同步

GCD下怎么样实现同步操作?这里有四种思路。

第一串行队列,第二并行队列,第三分组,第四信号量。

GCD下的dispatch_queue队列都是FIFO队列,就是按照提交到队列中的顺序执行,那这里分串行队列和并行队列是什么情况呢?串行队列是提交到队列里的任务按照提交的顺序执行,并且是执行完了上一个任务后再执行下一个任务;并行队列同样按照提交的顺序执行,不过不想串行队列一个任务执行完了后再执行下一个任务,而是可以以任何顺序执行。串行队列只开一个线程,并行队列开启多个线程同时执行任务。

--------------------------------------

常见的实例:去网上获取一张图片,然后展示在视图上。分成两步先去下载图片,然后显示在视图上,这两步是同步的。

一.串行队列

把这两个任务先后提交到一个串行队列里。

    // 创建一个串形队列
    dispatch_queue_t serilQueue = dispatch_queue_create("com.quains.myQueue", 0);
    
    // 开始时间
    NSDate *startTime = [NSDate date];
    
    
    __block UIImage *image = nil;
    
    // 1.先去网上下载图片
    dispatch_async(serilQueue, ^{
        NSString *urlAsString = @"xxx";
        NSURL *url = [NSURL URLWithString:urlAsString];
        
        NSError *downloadError = nil;
        
        NSData *imageData = [NSURLConnection sendSynchronousRequest:[NSURLRequest requestWithURL:url] returningResponse:nil error:&downloadError];
        
        if (downloadError == nil && imageData != nil) {
            image = [[UIImage imageWithData:imageData] retain];
        }
        else if(downloadError != nil){
            NSLog(@"error happened = %@", downloadError);
        }
        else {
            NSLog(@"No data download");
        }
    });
    
    // 2.在主线程展示到界面里
    dispatch_async(serilQueue, ^{
        
        NSLog(@"当前线程:%@",[NSThread currentThread]);
        
        // 界面元素一般在主线程展示
        dispatch_async(dispatch_get_main_queue(), ^{
        if (image != nil) {
            
            UIImageView *imageView = [[UIImageView alloc] initWithFrame:self.view.bounds];
            
            [imageView setImage:image];
            
            [imageView setContentMode:UIViewContent
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值