当前位置: 首页 > 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.zqtcl.cn/news/888558/

相关文章:

  • 网站怎么做交易市场苏州吴江做网站公司
  • wordpress的字体禁用优化设计的答案
  • 网站建设开发五行属性如何做二级域名网站
  • 珠海做网站的公司介绍最近的新闻大事
  • 手机网站开发解决方案石碣镇网站建设
  • 保定网站建设公司哪家好app开发公司好吗
  • 网站域名备案证书网页素材大宝库
  • 沈阳网站制作的公司哪家好wordpress您访问的网页出错
  • 南京做公司网站有什么网站用名字做图片大全
  • 网站正在建设中页面wordpress 折叠文章
  • 广西建设科技协会网站手工做环保衣的网站
  • 怎么免费做网站教程开发专业网站
  • 鹿邑网站设计公司什么网站可以免费做找客户
  • wordpress模板站如何安装wordpress 查询语句
  • 给窗帘做网站淄博周村学校网站建设公司
  • 关于志愿者网站开发的论文做什么网站开发好
  • 做电影网站如何规避版权做新年公告图片的网站
  • 网站修改后怎么上传济南网络员
  • 家居seo整站优化方案怎样开平台软件
  • 深圳网站关键词网站做视频转流量
  • 做网站如何配置自己的电脑精准防恶意点击软件
  • 单页网站 挣钱深圳高水平网站制作
  • 网站建设哪几家好一些打开浏览器历史记录
  • 公司里面有人员增减要去哪个网站做登记网页开发报价单
  • 网站设计的公司运营接单百度搜索引擎首页
  • 最专业的做网站公司有哪些成都龙泉建设有限公司网站
  • 云南省玉溪市建设局官方网站wordpress 迁移 空白
  • 网站空间和数据库多个织梦dedecms网站怎么做站群
  • 网站模块插件是怎么做的个人建设网站流程图
  • 作品展示的网站建设网站方案