GCD 的使用 并行串行 队列


/**
 队列的类型只决定任务是并发还是串行执行,不影响同步还是异步;
 决定同步还是异步,还要看函数名称,dispatch_asynch代表异步,dispatch_synch代表同步;
 
 GCD需要执行数据 必须要加入到队列中,
 串行队列 是自己创建的 dispatch_queue_t queue = dispatch_queue_create("hello queue", NULL);
 并行队列 用于多核多任务 单任务也可使用 dispatch_queue_t queue =
                            优先级                       默认为0
 dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
 
 队列执行任务的时候还分异步&同步;  把任务 加入到队列               执行的代码
 异步执行队列任务   dispatch_async(<#dispatch_queue_t queue#>, <#^(void)block#>)
 同步执行队列任务   dispatch_sync(<#dispatch_queue_t queue#>, <#^(void)block#>)
 
 异步线程中有一个主线程,也有一个异步线程(第一个异步线程需要一个队列容器),子异步线程中的队列就是主线程。可以吧子异步线程中的数据在返回给主线程中;
 建议:
    一般只需要显示一个地方的话可以自己创建队列, 使用异步同步都可以
 dispatch_queue_t queue = dispatch_queue_create("hello queue", NULL);
    如果显示数据比较多,需要提高效率可以使用并行队列 建议使用异步
  dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
 
 
 如果使用了ARC那么 创建队列&组 就不需要release了;
 如果没有使用ARC 创建队列 & 组 的话需要释放,release,当创建了一个对象比如alloc new copy 都需要release;
 */

- (void)viewDidLoad
{
    [super viewDidLoad];
   
    [self groupAsync];
   
}

//异步获取数据,把数据装入组中再把组中数据放入主线程
- (void)groupAsync
{
    int a = 2;
    int b = 3;
    
    __block int c;
    __block int d;
  //使用并发队列                                              优先级  默认的
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
  
    //异步  使用队列
    dispatch_sync(queue, ^{
    
        //创建组 容器               创建组
        dispatch_group_t group = dispatch_group_create(); //创建了组后需要手动释放的;
        //容器组中的子异步
        dispatch_group_async(group, queue, ^{
            c = a + b;
        });
        //容器组中的子异步
        dispatch_group_async(group, queue, ^{
            d = a * b;
        });
        
        //主线程               创建主线程
        dispatch_queue_t main = dispatch_get_main_queue();
        
        //从组中获取数据放入主线程中
        dispatch_group_async(group, main, ^{
           
           int e = c + d;
            NSLog(@"%i",e);
//            dispatch_release(group); 手动释放组;
        });
        
    });
       
}

//异步获取数据返回到主线程中
- (void)asynch
{
    //串行队列 一个进程任务中只能有一个线程          内容,默认null
    dispatch_queue_t queue = dispatch_queue_create("hello queue", NULL);//串行 自己创建需要自己释放;
    
    //并发队列 一个进程任务中可以有多个线程   获取一个全局队列  优先级,默认0;
    //  dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    
    //循环执行 10次, 在队列中    变量
    //异步线程  一个锁对多把钥匙
    dispatch_async(queue, ^{
        
        //主线程                 创建主线程
        dispatch_queue_t main = dispatch_get_main_queue();
        //相当于遍历1-10的数据
        dispatch_apply(10, main, ^(size_t i) {
            
            NSLog(@"%zu",i);
            
        });
        
    });
//     dispatch_release(queue);  需要手动释放

}

gcd 异步操作 比如网络请求刷新界面数据 

 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            
            [[PLNewRequestCenter shareRequestCenter] plsendRequest:param setOpt:PLgetProgramCollection setSuccessBlock:^(NSDictionary *dic) {
                
                NSLog(@"errCode:%@",[dic objectForKey:@"errCode"]);
                
                dispatch_async(dispatch_get_main_queue(), ^{
                    
                    if ([[dic objectForKey:@"errCode"] integerValue] == 0) {
                        
                        if ([[dic objectForKey:@"resultData"] count] > 0) {
                            
                            [rightButton1 setBackgroundImage:[UIImage imageNamed:@"节目详情收藏过.png"] forState:UIControlStateNormal];
                        }
                        
                    }else{
                        
                        [rightButton1 setBackgroundImage:[UIImage imageNamed:@"节目详情收藏按钮.png"] forState:UIControlStateNormal];
                    }
                });
                
            } setFailBlock:^(NSDictionary *dic) {
                
            }];
            
        });



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值