1、GCD

使用不同优先级的若干个队列乍听起来非常直接,只是,我们强烈建议,在绝大多数情况下使用默认的优先级队列就能够了。假设运行的任务须要訪问一些共享的资源,那么在不同优先级的队列中调度这些任务非常快就会造成不可预期的行为。这样可能会引起程序的全然挂起,由于低优先级的任务堵塞了高优先级任务,使它不能被运行。

2、Run Loops

实际上,Run loop并不像 GCD 或者操作队列那样是一种并发机制,由于它并不能并行运行任务。只是在主 dispatch/operation 队列中, run loop 将直接配合任务的运行,它提供了一种异步运行代码的机制。

Run loop 比起操作队列或者 GCD 来说easy使用得多,由于通过 run loop ,你不必处理并发中的复杂情况,就能异步地运行任务。

一个 run loop 总是绑定到某个特定的线程中。main run loop 是与主线程相关的,在每个 Cocoa 和 CocoaTouch 程序中,这个 main run loop 都扮演了一个核心角色,它负责处理 UI 事件、计时器,以及其他内核相关事件。不管你什么时候设置计时器、使用NSURLConnection 或者调用
performSelector:withObject:afterDelay:,事实上背后都是 run loop 在处理这些异步任务。

不管何时你使用 run loop 来运行一个方法的时候,都须要记住一点:run loop 能够运行在不同的模式中,每种模式都定义了一组事件,供 run loop 做出响应。这在相应 main run loop 中临时性的将某个任务优先运行这样的任务上是一种聪明的做法。

关于这点,在 iOS 中很典型的一个演示样例就是滚动。在进行滚动时,run loop 并非执行在默认模式中的,因此, run loop 此时并不会响应比方滚动前设置的计时器。一旦滚动停止了,run loop 会回到默认模式,并执行加入到队列中的相关事件。假设在滚动时,希望计时器能被触发,须要将其设为NSRunLoopCommonModes 的模式,并加入到
run loop 中。

主线程一般来说都已经配置好了 main run loop。然而其它线程默认情况下都没有设置 run loop。你也能够自行为其它线程设置 run loop ,可是一般来说我们非常少须要这么做。大多数时间使用 main run loop 会easy得多。假设你须要处理一些非常重的工作,可是又不想在主线程里做,你仍然能够在你的代码在 main run loop 中被调用后将工作分配给其它队列。

假设你真须要在别的线程中加入一个 run loop ,那么不要忘记在 run loop 中至少加入一个 input source 。假设 run loop 中没有设置好的 input source,那么每次执行这个 run loop ,它都会马上退出。

GCD && Run Loops学习笔记的更多相关文章

  1. RAC学习笔记

    RAC学习笔记 ReactiveCocoa(简称为RAC),是由Github开源的一个应用于iOS和OS开发的新框架,Cocoa是苹果整套框架的简称,因此很多苹果框架喜欢以Cocoa结尾. 在学习Re ...

  2. iOS学习笔记-精华整理

    iOS学习笔记总结整理 一.内存管理情况 1- autorelease,当用户的代码在持续运行时,自动释放池是不会被销毁的,这段时间内用户可以安全地使用自动释放的对象.当用户的代码运行告一段 落,开始 ...

  3. iOS学习笔记总结整理

    来源:http://mobile.51cto.com/iphone-386851_all.htm 学习IOS开发这对于一个初学者来说,是一件非常挠头的事情.其实学习IOS开发无外乎平时的积累与总结.下 ...

  4. 尚学堂JAVA基础学习笔记

    目录 尚学堂JAVA基础学习笔记 写在前面 第1章 JAVA入门 第2章 数据类型和运算符 第3章 控制语句 第4章 Java面向对象基础 1. 面向对象基础 2. 面向对象的内存分析 3. 构造方法 ...

  5. Numpy学习笔记(上篇)

    目录 Numpy学习笔记(上篇) 一.Jupyter Notebook的基本使用 二.Jpuyter Notebook的魔法命令 1.%run 2.%timeit & %%timeit 3.% ...

  6. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二十三章:角色动画

    原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二十三章:角色动画 学习目标 熟悉蒙皮动画的术语: 学习网格层级变换 ...

  7. ucos实时操作系统学习笔记——任务间通信(消息)

    ucos另一种任务间通信的机制是消息(mbox),个人感觉是它是queue中只有一个信息的特殊情况,从代码中可以很清楚的看到,因为之前有关于queue的学习笔记,所以一并讲一下mbox.为什么有了qu ...

  8. 0037 Java学习笔记-多线程-同步代码块、同步方法、同步锁

    什么是同步 在上一篇0036 Java学习笔记-多线程-创建线程的三种方式示例代码中,实现Runnable创建多条线程,输出中的结果中会有错误,比如一张票卖了两次,有的票没卖的情况,因为线程对象被多条 ...

  9. Linux 学习笔记

    Linux学习笔记 请切换web视图查看,表格比较大,方法:视图>>web板式视图 博客园不能粘贴图片吗 http://wenku.baidu.com/view/bda1c3067fd53 ...

随机推荐

  1. poj2386 Lake Counting(简单DFS)

    转载请注明出处:viewmode=contents">http://blog.csdn.net/u012860063?viewmode=contents 题目链接:http://poj ...

  2. Windows无法启动OracleOraDb10g_home1TNSListener维修,1错误067

    Oracle服务无法启动,据报:Windows无法启动OracleOraDb10g_home1TNSListener维修,错误 1067:这个过程意外终止. 在网上找了好久也没弄好.说什么环境变量的又 ...

  3. IOS-QQ登陆之苹果程序流程

    1.新建项目,通过main函数循环执行代码,直到应用被关闭. 2.点击项目,建立storyboard文件,并在info文件夹中指定第一个storyboard文件 3.建立Controller文件. 组 ...

  4. 运行safari提示:无法启动此程序,因为计算机中丢失 QTCF.dll

    解决办法: 1.去百度搜索“QTCF.dll”,找到一个靠谱的下载地址获取到该dll文件: 2.将文件放到 安装目录:Safari\Apple Application Support 下边.

  5. [LeetCode] Combinations [38]

    称号 Given two integers n and k, return all possible combinations of k numbers out of 1 ... n. For exa ...

  6. Activity生命周期解决(有图有真相)

    Activity完整的生命周期: 启动Activity的周期历程: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcGVuZ2t2/font/5a6L5L2 ...

  7. HDOJ 4974 A simple water problem

    A simple water problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/O ...

  8. opencv-形态处理

    开运算 (Opening) 原理摘自:http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/imgproc/opening_closi ...

  9. 于ubuntu-kylin14.10下一个,无法使用apt-get具( libc6-i386 : 赖: libc6 (= 2.15-0ubuntu10.5) 但 2.19-0ubuntu6 一个已)

    这篇文章有xhz1234(徐洪志)书写.转载请注明出处. http://blog.csdn.net/xhz1234/article/details/37044531 作者:徐洪志 背景:安装wine. ...

  10. Android Notification (转)

    上回我们提到在4.0ICS之后,Google为Android平台的Notification这把“倚天剑”注入了更多新鲜的元素,使其更加实用美观.Notification的样式从此变得丰富起来,以适应于 ...