GCD常用方法

来源:互联网 发布:python 对数函数ln 编辑:程序博客网 时间:2024/05/08 20:00
/*—————————————————————————————————————————————————GCD常用方法———————————————————————————————————————————————————————*/
   /**
     *  dispatch_async(
放在执行地方,执行代码)
     *
     *  dispatch_get_main_queue()
放在主线程执行
     *
     *  dispatch_get_global_queue(
执行级别, 0)放在后台执行
     *
     * DISPATCH_QUEUE_PRIORITY_HIGH 2   
最高级别
     * DISPATCH_QUEUE_PRIORITY_DEFAULT 0
默认级别
     * DISPATCH_QUEUE_PRIORITY_LOW (-2) 
最低级别
     * DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN
(后台优先队列调度_ _ _背景)没有试过
     *
     *
     */

   
dispatch_async(dispatch_get_global_queue(0,0), ^{
       
for (int i =0; i<10; i++) {
           
NSLog(@"123");
        }
       
NSLog(@"处理耗时方法");
       
dispatch_async(dispatch_get_main_queue(), ^{
           
//回调或者说是通知主线程刷新,
           
//确保上面后台执行代码完成
        });
    });


/*—————————————————————————————————————————————————GCDl列队———————————————————————————————————————————————————————*/
   /**
     *  dispatch_group_t  
创建列队
     *
     *  dispatch_group_notify
列队结尾  最后执行
     *
     */

   
   
dispatch_group_tgroup = dispatch_group_create();
   
dispatch_group_async(group,dispatch_get_global_queue(0,0), ^{
       
NSLog(@"执行1");
    });
   
dispatch_group_async(group,dispatch_get_global_queue(0,0), ^{
       
// 并行执行的线程二
         
NSLog(@"执行2");
       
    });
   
dispatch_group_notify(group,dispatch_get_main_queue(), ^{
       
// 汇总结果
       
// 得到线程一和二的结果
         
NSLog(@"完成");
    });

/*—————————————————————————————————————————————————定时器———————————————————————————————————————————————————————*/
// 方法一.
   __blockNSIntegercount = sender.tag;
   
   
// 获得队列
   
dispatch_queue_tqueue = dispatch_get_main_queue();
   
   
// 创建一个定时器(dispatch_source_t本质还是个OC对象)
   
dispatch_source_ttimer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER,0,0, queue);
   // 设置定时器的各种属性(几时开始任务,每隔多长时间执行一次)
   // GCD的时间参数,一般是纳秒(1== 109次方纳秒)
   
// 何时开始执行第一个任务
   
// dispatch_time(DISPATCH_TIME_NOW, 1.0 * NSEC_PER_SEC)比当前时间晚3
   dispatch_time_t start =dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0* NSEC_PER_SEC));
   //    定时器时间
   uint64_t interval = (uint64_t)(1.0* NSEC_PER_SEC);
   
dispatch_source_set_timer(timer, start, interval,0);
   
   
// 设置回调
   
dispatch_source_set_event_handler(timer, ^{
       
NSLog(@"------------%@", [NSThreadcurrentThread]);
       
NSLog(@"%ld",(long)count);
//        count++;
       if (count == 0) {
           // 取消定时器
           
_btn.tag= 1;
        }
else{
           
dispatch_cancel(timer);
        }
    });
   
   
// 启动定时器
   dispatch_resume(timer);
// 方法二.(释放方法不同dispatch_source_set_cancel_handler原始方法(可以继续调用相关方法) dispatch_cancel简单方法(不可以调用其他方法)
   __blockNSIntegercount = sender.tag;

   
dispatch_source_ttimer=dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER,0,0,dispatch_get_main_queue());
   
dispatch_time_tstart = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0* NSEC_PER_SEC));
   
//    定时器时间
   
uint64_tinterval = (uint64_t)(5.0* NSEC_PER_SEC);
   
//最后一个参数几秒收执行定时器
   
dispatch_source_set_timer(timer,  start, interval,0);
//    设置回调
   
dispatch_source_set_event_handler(timer, ^{
       
NSLog(@"wakeup");
       
if (count == 0) {
           
// 取消定时器
           
_btn.tag= 1;
        }
else{
           
dispatch_source_cancel(timer);
        }
    });

   
dispatch_source_set_cancel_handler(timer, ^{
       
NSLog(@"cancel");
    });
   
//启动
   dispatch_resume(timer);

/*—————————————————————————————————————————————————延时执行和自定义执行———————————————————————————————————————————————————————*/

   /**
     *  GCD
几分钟后执行
     *
     *  @param DISPATCH_TIME_NOW
现在执行
     *  @param int64_t          

     *
     */

   
   
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.1* NSEC_PER_SEC)), dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH,0), ^{
       
NSLog(@"1.1秒后执行");
    });
//    自定义方法
   
dispatch_queue_turls_queue = dispatch_queue_create("blog.devtang.com",NULL);
   
dispatch_async(urls_queue, ^{
       
// your code
       
NSLog(@"自定义");
    });
0 0
原创粉丝点击