GCD

本文深入探讨了GCD(Grand Central Dispatch)的各种高级特性,包括队列类型、操作方式、组监听、屏障异步、一次性执行、延迟执行、队列控制及应用技巧。通过实例演示了串行队列、并行队列的创建与使用,dispatch_group_async的监听功能,dispatch_barrier_async的顺序控制,以及dispatch_once确保代码唯一执行的场景。

队列:

    dispatch_queue_t

    串行队列: 队列中的任务只会顺序执行;

    并行队列: 队列中的任务通常会并发执行.

操作:

    dispatch_async 异步操作,会并发执行,无法确定任务的执行顺序;

    dispatch_sync 同步操作,会依次顺序执行,能够决定任务的执行顺序.   //最好不要用   他是同步先执行完这个,才执行其他,导致页面卡死。

   dispatch_async(dispatch_queue_t queue, dispatch_block_t block); //async表明异步运行,block代表的是你要做的事情,queue则是你把任务交给谁来处理了.

一.Dispatch Queue

Dispatch Queue是一个任务执行队列,可以让你异步或同步地执行多个Block或函数。Dispatch Queue是FIFO的,即先入队的任务总会先执行。目前有三种类型的Dispath Queue:

1.串行队列(Serial dispatch queue)

2.并发队列(Concurrent dispatch queue)

3.主队列(Main dispatch queue)

看例子:

- (IBAction)touchup:(id)sender {
//    dispatch_queue_t myQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);//并行  结果与下列两种相反。  
      dispatch_queue_t myQueue = dispatch_queue_create("com.queue", DISPATCH_QUEUE_CONCURRENT); //并行  结果与下列两种相反。   
 //    dispatch_queue_t myQueue = dispatch_queue_create("com.queue", NULL); //顺序执行 NULL的时候默认是顺序执行 
//    dispatch_queue_t myQueue = dispatch_queue_create("serialQueue", DISPATCH_QUEUE_SERIAL); //顺序执行   顺序执行最好用这两种  不要用sync,会造成页面卡死。
   dispatch_async(myQueue, ^{    
      [NSThread sleepForTimeInterval:6];   
       NSLog(@"[NSThread sleepForTimeInterval:6];");   
   });  
    dispatch_async(myQueue, ^{     
     [NSThread sleepForTimeInterval:3];    
      NSLog(@"[NSThread sleepForTimeInterval:3];");  
    }); 
    dispatch_async(myQueue, ^{    
      [NSThread sleepForTimeInterval:1];    
      NSLog(@"[NSThread sleepForTimeInterval:1];");   
   });
}

总结:串行队列一次只能处理一个任务,可以由用户调用dispatch_queue_create创建。dispatch_queue_create第一个参数是串行队列标识,一般用反转域名的格式表示以防冲突;第二个参数是queue的类型,设为NULL时默认是DISPATCH_QUEUE_SERIAL,将创建串行队列,在必要情况下,你可以将其设置为DISPATCH_QUEUE_CONCURRENT来创建自定义并行队列。

       并行队列可以同时处理多个任务,在不得以的情况下可以用dispatch_queue_create创建,但一般我们都要用系统预定义的并行队列,即全局队列(Global Concurrent Dispatch Queues)。

提示:

    不建议使用不同优先级的队列,因为如果设计不当,可能会出现优先级反转,即低优先级的操作阻塞高优先级的操作.

二.Dispatch Group

dispatch_group_async可以实现监听一组任务是否完成,完成后得到通知执行其他的操作。这个方法很有用,比如你执行三个下载任务,当三个任务都下载完成后你才通知界面说完成的了。

  
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_group_t group = dispatch_group_create();
    dispatch_group_async(group, queue, ^{
        [NSThread sleepForTimeInterval:6];
        NSLog(@"group1 [NSThread sleepForTimeInterval:6];");
    });
    dispatch_group_async(group, queue, ^{
        [NSThread sleepForTimeInterval:3];
        NSLog(@"group2 [NSThread sleepForTimeInterval:3];");
    });
    dispatch_group_async(group, queue, ^{
        [NSThread sleepForTimeInterval:1];
        NSLog(@"group3 [NSThread sleepForTimeInterval:1];");
    });
    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        NSLog(@"main thread.");
    });
 dispatch_group_async只会监听最终的结果完成后,并通知main queue

三.dispatch_barrier_async

dispatch_barrier_async是在前面的任务执行结束后它才执行,而且它后面的任务等它执行完成之后才会执行,常用于读写的数据同步操作。

- (IBAction)clickBarrier:(id)sender {
//    dispatch_queue_t myQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); //并行执行
     dispatch_queue_t myQueue = dispatch_queue_create("com.queue", DISPATCH_QUEUE_CONCURRENT); //先执行前两项,之后再往下并行执行。
    dispatch_async(myQueue, ^{
        [NSThread sleepForTimeInterval:6];
        NSLog(@"[NSThread sleepForTimeInterval:6];");
    });
    dispatch_async(myQueue, ^{
        [NSThread sleepForTimeInterval:3];
        NSLog(@"[NSThread sleepForTimeInterval:3];");
    });
    dispatch_barrier_async(myQueue, ^{
        NSLog(@"并行执行");
    });
    dispatch_async(myQueue, ^{
        [NSThread sleepForTimeInterval:3];
        NSLog(@"[NSThread sleepForTimeInterval:3];");
    });
    dispatch_async(myQueue, ^{
        [NSThread sleepForTimeInterval:1];
        NSLog(@"[NSThread sleepForTimeInterval:1];");
    });
}
/*打印结果   2015-05-21 14:32:11.898 queueDemo[1870:101851] [NSThread sleepForTimeInterval:3];
            2015-05-21 14:32:14.897 queueDemo[1870:101850] [NSThread sleepForTimeInterval:6];
            2015-05-21 14:32:14.897 queueDemo[1870:101850] 并行执行
            2015-05-21 14:32:15.901 queueDemo[1870:101850] [NSThread sleepForTimeInterval:1];
            2015-05-21 14:32:15.901 queueDemo[1870:101851] [NSThread sleepForTimeInterval:3];  */

总计:dispatch_barrier_async的顺序执行是依赖queue的类型,必需要queue的类型为dispatch_queue_create创建的,而且attr参数值必需是DISPATCH_QUEUE_CONCURRENT类型

四.dispatch_once

 dispatch_once这个函数,它可以保证整个应用程序生命周期中某段代码只被执行一次!多用于对单例的操作。

  1. static dispatch_once_t onceToken;  
        dispatch_once(&onceToken, ^{  
            // code to be executed once  
        });  

五.Dispatch Queue的延迟执行:dispatch_after():

延时操作大都用这个[self performSelector:@selector(btn) withObject:nil afterDelay:1];或者定时

但这两个个方法执行效率低,而且定时时间不准时。所以现在一般都用GCD这个。

  1. double delayInSeconds = 2.0;  
        dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);  // * NSEC_PER_SEC 这个不能省,否则就是2毫秒了,默认是毫秒,NSEC_PER_SEC表示秒 NSEC_PER_MSEC表示毫秒 
        dispatch_after(popTime, dispatch_get_main_queue(), ^(void){  
            // code to be executed on the main queue after delay  
        });  

     

六.线程队列的挂起与执行

// 挂起队列
dispatch_suspend(queue);
// 恢复队列执行
dispatch_resume(queue);

七.其他

dispatch_apply 执行某个代码片段N次。

dispatch_set_target_queue 可以设置一个dispatch queue的优先级,或者指定一个dispatch source相应的事件处理提交到哪个queue上。

 

附代码:http://i.cnblogs.com/Files.aspx  queueDemo.zip 

 

推荐文章:http://my.oschina.net/aofe/blog/270093

              http://blog.youkuaiyun.com/samuelltk/article/details/9452203

       http://www.cnblogs.com/SnailFish/articles/3199863.html

       http://www.cocoachina.com/industry/20131210/7506_2.html

转载于:https://www.cnblogs.com/xing-li/p/4519524.html

内容概要:本文介绍了ENVI Deep Learning V1.0的操作教程,重点讲解了如何利用ENVI软件进行深度学习模型的训练与应用,以实现遥感图像中特定目标(如集装箱)的自动提取。教程涵盖了从数据准备、标签图像创建、模型初始化与训练,到执行分类及结果优化的完整流程,并介绍了精度评价与通过ENVI Modeler实现一键化建模的方法。系统基于TensorFlow框架,采用ENVINet5(U-Net变体)架构,支持通过点、线、面ROI或分类图生成标签数据,适用于多/高光谱影像的单一类别特征提取。; 适合人群:具备遥感图像处理基础,熟悉ENVI软件操作,从事地理信息、测绘、环境监测等相关领域的技术人员或研究人员,尤其是希望将深度学习技术应用于遥感目标识别的初学者与实践者。; 使用场景及目标:①在遥感影像中自动识别和提取特定地物目标(如车辆、建筑、道路、集装箱等);②掌握ENVI环境下深度学习模型的训练流程与关键参数设置(如Patch Size、Epochs、Class Weight等);③通过模型调优与结果反馈提升分类精度,实现高效自动化信息提取。; 阅读建议:建议结合实际遥感项目边学边练,重点关注标签数据制作、模型参数配置与结果后处理环节,充分利用ENVI Modeler进行自动化建模与参数优化,同时注意软硬件环境(特别是NVIDIA GPU)的配置要求以保障训练效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值