当前位置: 首页 > news >正文

阿里 网站建设阿里巴巴网站建设销售

阿里 网站建设,阿里巴巴网站建设销售,网站右侧悬浮代码,南通市区有哪几家做网站的一、什么是GCD#xff1f;Grand Central Dispatch或者GCD#xff0c;是一套低层API#xff0c;提供了一种新的方法来进行并发程序编写。从基本功能上讲#xff0c;GCD有点像NSOperationQueue#xff0c;他们都允许程序将任务切分为多个单一任务然后提交至工作队列来并发地… 一、什么是GCD Grand Central Dispatch或者GCD是一套低层API提供了一种新的方法来进行并发程序编写。从基本功能上讲GCD有点像NSOperationQueue他们都允许程序将任务切分为多个单一任务然后提交至工作队列来并发地或者串行地执行。GCD比之NSOpertionQueue更底层更高效并且它不是Cocoa框架的一部分。 除了代码的平行执行能力GCD还提供高度集成的事件控制系统。可以设置句柄来响应文件描述符、mach portsMach port 用于 OS X上的进程间通讯、进程、计时器、信号、用户生成事件。这些句柄通过GCD来并发执行。 GCD的API很大程度上基于block当然GCD也可以脱离block来使用比如使用传统c机制提供函数指针和上下文指针。实践证明当配合block使用时GCD非常简单易用且能发挥其最大能力。 你可以在Mac上敲命令“man dispatch”来获取GCD的文档。 二、优势GCD提供很多超越传统多线程编程的优势 易用: GCD比之thread跟简单易用。由于GCD基于work unit而非像thread那样基于运算所以GCD可以控制诸如等待任务结束、监视文件描述符、周期执行代码以及工作挂起等任务。基于block的血统导致它能极为简单得在不同代码作用域之间传递上下文。 效率: GCD被实现得如此轻量和优雅使得它在很多地方比之专门创建消耗资源的线程更实用且快速。这关系到易用性导致GCD易用的原因有一部分在于你可以不用担心太多的效率问题而仅仅使用它就行了。 性能: GCD自动根据系统负载来增减线程数量这就减少了上下午切换以及增加了计算效率。 三、Dispatch Objects 尽管GCD是纯c语言的但它被组建成面向对象的风格。GCD对象被称为dispatch object。Dispatch object像Cocoa对象一样是引用计数的。使用dispatch_release和dispatch_retain函数来操作dispatch object的引用计数来进行内存管理。但主意不像Cocoa对象dispatch object并不参与垃圾回收系统所以即使开启了GC你也必须手动管理GCD对象的内存。 Dispatch queues 和 dispatch sources后面会介绍到可以被挂起和恢复可以有一个相关联的任意上下文指针可以有一个相关联的任务完成触发函数。可以查阅“man dispatch_object”来获取这些功能的更多信息。 四、Dispatch Queues GCD的基本概念就是dispatch queue。dispatch queue是一个对象它可以接受任务并将任务以先到先执行的顺序来执行。dispatch queue可以是并发的或串行的。并发任务会像NSOperationQueue那样基于系统负载来合适地并发进行串行队列同一时间只执行单一任务。 GCD中有三种队列类型 (1)The main queue: 与主线程功能相同。实际上提交至main queue的任务会在主线程中执行。main queue可以调用dispatch_get_main_queue()来获得。因为main queue是与主线程相关的所以这是一个串行队列。 (2)Global queues: 全局队列是并发队列并由整个进程共享。进程中存在三个全局队列高、中默认、低三个优先级队列。可以调用dispatch_get_global_queue函数传入优先级来访问队列。 (3)用户队列: 用户队列 (GCD并不这样称呼这种队列, 但是没有一个特定的名字来形容这种队列所以我们称其为用户队列) 是用函数 dispatch_queue_create 创建的队列. 这些队列是串行的。正因为如此它们可以用来完成同步机制, 有点像传统线程中的mutex。 五、创建队列 要使用用户队列我们首先得创建一个。调用函数dispatch_queue_create就行了。函数的第一个参数是一个标签这纯是为了debug。Apple建议我们使用倒置域名来命名队列比如“com.dreamingwish.subsystem.task”。这些名字会在崩溃日志中被显示出来也可以被调试器调用这在调试中会很有用。第二个参数目前还不支持传入NULL就行了。 六、提交 Job 向一个队列提交Job很简单调用dispatch_async函数传入一个队列和一个block。队列会在轮到这个block执行时执行这个block的代码。下面的例子是一个在后台执行一个巨长的任务      dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{              [self goDoSomethingLongAndInvolved];              NSLog(Done doing something long and involved);      }); dispatch_async 函数会立即返回, block会在后台异步执行。  当然通常任务完成时简单地NSLog个消息不是个事儿。在典型的Cocoa程序中你很有可能希望在任务完成时更新界面这就意味着需要在主线程中执行一些代码。你可以简单地完成这个任务——使用嵌套的dispatch在外层中执行后台任务在内层中将任务dispatch到main queue      dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{              [self goDoSomethingLongAndInvolved];              dispatch_async(dispatch_get_main_queue(), ^{                    [textField setStringValue:Done doing something long and involved];              });      }); 还有一个函数叫dispatch_sync它干的事儿和dispatch_async相同但是它会等待block中的代码执行完成并返回。结合 __block类型修饰符可以用来从执行中的block获取一个值。例如你可能有一段代码在后台执行而它需要从界面控制层获取一个值。那么你可以使用dispatch_sync简单办到      __block NSString *stringValue;      dispatch_sync(dispatch_get_main_queue(), ^{              // __block variables arent automatically retained              // so wed better make sure we have a reference we can keep              stringValue [[textField stringValue] copy];      });      [stringValue autorelease];      // use stringValue in the background now 我们还可以使用更好的方法来完成这件事——使用更“异步”的风格。不同于取界面层的值时要阻塞后台线程你可以使用嵌套的block来中止后台线程然后从主线程中获取值然后再将后期处理提交至后台线程      dispatch_queue_t bgQueue myQueue;          dispatch_async(dispatch_get_main_queue(), ^{              NSString *stringValue [[[textField stringValue] copy] autorelease];            dispatch_async(bgQueue, ^{                  // use stringValue in the background now              });      }); 取决于你的需求myQueue可以是用户队列也可以使全局队列。   七、不再使用锁Lock 用户队列可以用于替代锁来完成同步机制。 在传统多线程编程中你可能有一个对象要被多个线程使用你需要一个锁来保护这个对象NSLock *lock; 访问代码会像这样      - (id)something      {          id localSomething;          [lock lock];          localSomething [[something retain] autorelease];          [lock unlock];          return localSomething;      }        - (void)setSomething:(id)newSomething      {          [lock lock];          if(newSomething ! something)          {              [something release];              something [newSomething retain];              [self updateSomethingCaches];          }          [lock unlock];      } 使用GCD可以使用queue来替代dispatch_queue_t queue; 要用于同步机制queue必须是一个用户队列而非全局队列所以使用usingdispatch_queue_create初始化一个。然后可以用dispatch_async 或者 dispatch_sync将共享数据的访问代码封装起来      - (id)something      {          __block id localSomething;          dispatch_sync(queue, ^{              localSomething [something retain];          });          return [localSomething autorelease];      }        - (void)setSomething:(id)newSomething      {          dispatch_async(queue, ^{              if(newSomething ! something)              {                  [something release];                  something [newSomething retain];                  [self updateSomethingCaches];              }          });      } 值得注意的是dispatch queue是非常轻量级的所以你可以大用特用就像你以前使用lock一样。 八、现在你可能要问“这样很好但是有意思吗我就是换了点代码办到了同一件事儿。” 实际上使用GCD途径有几个好处 平行计算: 注意在第二个版本的代码中 -setSomething:是怎么使用dispatch_async的。调用 -setSomething:会立即返回然后这一大堆工作会在后台执行。如果updateSomethingCaches是一个很费时费力的任务且调用者将要进行一项处理器高负荷任务那么这样做会很棒。 安全: 使用GCD我们就不可能意外写出具有不成对Lock的代码。在常规Lock代码中我们很可能在解锁之前让代码返回了。使用GCD队列通常持续运行你必将归还控制权。 控制: 使用GCD我们可以挂起和恢复dispatch queue而这是基于锁的方法所不能实现的。我们还可以将一个用户队列指向另一个dspatch queue使得这个用户队列继承那个dispatch queue的属性。使用这种方法队列的优先级可以被调整——通过将该队列指向一个不同的全局队列若有必要的话这个队列甚至可以被用来在主线程上执行代码。 集成: GCD的事件系统与dispatch queue相集成。对象需要使用的任何事件或者计时器都可以从该对象的队列中指向使得这些句柄可以自动在该队列上执行从而使得句柄可以与对象自动同步。 转载自http://www.dreamingwish.com/dream-2012/of-of-of-of-gcd-introduced-1-basic-concepts-in-and-the-dispatch-queue.html
http://www.pierceye.com/news/138008/

相关文章:

  • 天河高端网站建设云南建设工程招投标信息网
  • iis 网站制作凡科互动小游戏怎么刷高分
  • 接网站开发项目如何做网站背景
  • 重庆奉节网站建设定制vx怎么弄
  • 烟台建网站公司哪家好辽源做网站的公司
  • 建设企业网站地址网站空间 虚拟主机
  • h5网站模板免费下载网页源码提取工具
  • 网站设计和网页设计建网站必备软件
  • 中国建设银行上海市分行网站音乐网站开发可行性分析
  • 如何用天地图做网站做面包有哪些网站知乎
  • 买了域名之后怎么建设网站做网站一年赚一千万
  • 跟网站开发公司签合同主要要点个人网站logo需要备案吗
  • 免费询盘网站自我介绍ppt模板
  • 中国会议营销网站怎么做找优惠券的网站
  • 做网站的那些事wordpress改写
  • 仿造整个网站呼市网站建设公司
  • 网站被黑客入侵怎么办企业文化墙设计网站推荐
  • 建设网站的群婚礼婚庆网站建设需求分析
  • 全椒县城乡建设局网站网站怎么做营销策划
  • 响应式网站制作流程河北企业建网站
  • 常州新北区有做淘宝网站策划的吗什么建设网站
  • 成品网站源码68w68游戏wordpress php推送示例
  • 博优云软件官方网站wordpress 个人
  • 登封 网站建设烟台网站关键词推广
  • 深圳实惠的专业建站公司淘宝券商城网站制作
  • 珠海手机网站建设成都设计网站
  • 网站mp3播放器代码国家企业信息系统官方
  • 江西建设银行招聘网站pc网站还有必要做吗
  • 网站建设几个要素做网站需要学会什么软件
  • 做视频网站什么平台好站酷设计网站首页