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. 【cocos2d-x】尝鲜 Cocos Code IDE(不断更新)

    Cocos Code IDE 是一个基于 Eclipse 的跨平台 IDE ,专门为 cocos2d lua & js 开发者准备,通过此工具.你能够方便的创建游戏project.编写而且调试 ...

  2. table插入标签form标记怪现象

    最近帮朋友处理问题,它无法提交表单,得到一些时间,我发现了一个奇怪的问题 <table> <form action="upload.php" method=&qu ...

  3. 微服务API Gateway

    翻译-微服务API Gateway 原文地址:http://microservices.io/patterns/apigateway.html,以下是使用google翻译对原文的翻译. 让我们想象一下 ...

  4. 第十二章——SQLServer统计信息(1)——创建和更新统计信息

    原文:第十二章--SQLServer统计信息(1)--创建和更新统计信息 简介: 查询的统计信息: 目前为止,已经介绍了选择索引.维护索引.如果有合适的索引并实时更新统计信息,那么优化器会选择有用的索 ...

  5. D3D 扎带 小样本

    D3D 符合基本程序 #pragma once #pragma comment(lib,"d3d9.lib") #pragma comment(lib,"d3dx9.li ...

  6. [Linux]history 显示命令的运行时间

    显示线时间历史命令 这里的环境是centos5.8 vim ~/.bashrc 或者 ~/.bash_profile 添加 export HISTTIMEFORMAT="%F %T &quo ...

  7. OpenCV视频播放方法

    OpenCV视频播放方法 今天折腾了一下OpenCV的视频播放功能,希望能对项目又帮助- 代码还是非常easy的,仅仅是之前遇到点小麻烦,找不到cvCreateFileCapture函数的定义,花了一 ...

  8. HDU 4832(DP+计数问题)

    HDU 4832 Chess 思路:把行列的情况分别dp求出来,然后枚举行用几行,竖用几行.然后相乘累加起来就是答案 代码: #include <stdio.h> #include < ...

  9. 对LevelDB的“升级版”存储引擎RocksDB的调研成果

    Google的leveldb是个非常优秀的存储引擎.但还是有一些不尽人意的地方,比方leveldb不支持多线程合并.对key范围查找的支持还非常easy,未做优化措施,等等.而Facebook的Roc ...

  10. 10624 - Super Number

    题目链接 题意:给出n到m的范围,求出一个数在前i位数组成的数字能被i整除.假设存在输出这个数,假设不存在.输出-1. 思路:回溯,每次放第i位,然后推断是否符合题意.这题踩着时间过去的2.6s(看了 ...