GCD && Run Loops学习笔记

1、GCD

使用不同优先级的若干个队列乍听起来非常直接,不过,我们强烈建议,在绝大多数情况下使用默认的优先级队列就可以了。如果执行的任务需要访问一些共享的资源,那么在不同优先级的队列中调度这些任务很快就会造成不可预期的行为。这样可能会引起程序的完全挂起,因为低优先级的任务阻塞了高优先级任务,使它不能被执行。

2、Run Loops

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

Run loop 比起操作队列或者 GCD 来说容易使用得多,因为通过 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 会容易得多。如果你需要处理一些很重的工作,但是又不想在主线程里做,你仍然可以在你的代码在 main run loop 中被调用后将工作分配给其他队列。

如果你真需要在别的线程中添加一个 run loop ,那么不要忘记在 run loop 中至少添加一个 input source 。如果 run loop 中没有设置好的 input source,那么每次运行这个 run loop ,它都会立即退出。

GCD && Run Loops学习笔记

时间: 2024-10-12 04:44:48

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

iOS并发编程笔记,包含GCD,Operation Queues,Run Loops,如何在后台绘制UI,后台I/O处理,最佳安全实践避免互斥锁死锁优先级反转等,以及如何使用GCD监视进程文件文件夹,并发测试的方案等

iOS并发编程笔记,包含GCD,Operation Queues,Run Loops,如何在后台绘制UI,后台I/O处理,最佳安全实践避免互斥锁死锁优先级反转等,以及如何使用GCD监视进程文件文件夹,并发测试的方案等 线程 使用Instruments的CPU strategy view查看代码如何在多核CPU中执行.创建线程可以使用POSIX 线程API,或者NSThread(封装POSIX 线程API).下面是并发4个线程在一百万个数字中找最小值和最大值的pthread例子: #import

iOS学习笔记-精华整理

iOS学习笔记总结整理 一.内存管理情况 1- autorelease,当用户的代码在持续运行时,自动释放池是不会被销毁的,这段时间内用户可以安全地使用自动释放的对象.当用户的代码运行告一段 落,开始等待用户的操作,自动释放池就会被释放掉(调用dealloc),池中的对象都会收到一个release,有可能会因此被销毁. 2-成员属性:     readonly:不指定readonly,默认合成getter和setter方法.外界毫不关心的成员,则不要设置任何属性,这样封装能增加代码的独立性和安全

IOS学习笔记 -- 多线程

多线程1.多线程的原理 1>.同一时间,CPU只能处理1条线程,只有1条线程在工作(执行) 2>.多线程并发(同时)执行,其实是CPU快速地在多条线程之间调度(切换) 3>.如果CPU调度线程的时间足够快,就造成了多线程并发执行的假象如果线程非常非常多,会发生: 1>.CPU会在N多线程之间调度,CPU会累死,消耗大量的CPU资源 2>.每条线程被调度执行的频次会降低(线程的执行效率降低) 2.多线程的优缺点 1>.多线程的优点 能适当提高程序的执行效率 能适当提高资源

Time, Delays, and Deferred Work <LDD3> 学习笔记 + jiffies.h 分析

Time, Delays, and Deferred Work Dealing with time involves the following tasks, in order of increasing complexity: ? Measuring time lapses and comparing times ? Knowing the current time ? Delaying operation for a specified amount of time ? Scheduling

LoadRunner学习笔记--未经排版

LoadRunner学习笔记 并发用户数量: 与服务器进行交互的在线用户数量 请求响应时间 从客户端发送请求到得到整个响应的时间 一般包括网络响应时间+server的响应时间 事务相应时间 完成这个事务所用的时间 是性能测试中重点关注的指标 吞吐率 单位时间在网络上传输的数据量(吞吐量:网络上传输的数据总量) 指从server返回客户端的 是衡量网络性能的主要指标 TPS 每秒钟系统能够处理事务的数量 点击率 每秒发送的HTTP请求的数量 点击率越大对server的压力也就越大 资源利用率 对不

嵌入式学习笔记101-uboot_1.1.6移植(1)

根据前篇博文(嵌入式学习笔记100-uboot1.1.6初体验)最后的结论,现在开始将其实现: a. 修改makefile的CROSS_COMPILE指定编译器 arm-linux-gcc -v –> gcc version 3.4.5 CROSS_COMPILE = /opt/EmbedSky/crosstools_3.4.5_softfloat/gcc-3.4.5-glibc-2.3.6/arm-linux/bin/arm-linux- chmod -R 777 u-boot-1.1.6/

storm学习笔记完整记录(一)

storm有两种运行模式(本地模式和集群模式) 1. 首先创建一个类似于HelloWorld的简单程序,以便进入storm的大门,包结构如下: 2.从包结构可以知道,这是一个Maven Project,pom.xml的内容如下: <project xmlns="http://maven.apache.org/POM/4.0.0"          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    

Docker 学习笔记【1】Docker 相关概念,基本操作

计划:Docker 学习笔记[2] Docker 基础操作实操记录,Docker仓库.数据卷,网络基础学习---40 注:所有操作在root下执行 --1--概念: 1.Docker镜像: 镜像就是一个只读的模板,用于创建docker容器. Docker提供了简单的机制创建或者更新现有镜像,也可以从别处拿来现成镜像直接使用. 2.Docker容器: 可以认为是精简版的linux运行环境包含 [root权限,进程空间,用户空间,网络空间等]和应用程序 另外:镜像是只读的,容器基于镜像启动后创建一层

Tensorflow学习笔记2:About Session, Graph, Operation and Tensor

简介 上一篇笔记:Tensorflow学习笔记1:Get Started 我们谈到Tensorflow是基于图(Graph)的计算系统.而图的节点则是由操作(Operation)来构成的,而图的各个节点之间则是由张量(Tensor)作为边来连接在一起的.所以Tensorflow的计算过程就是一个Tensor流图.Tensorflow的图则是必须在一个Session中来计算.这篇笔记来大致介绍一下Session.Graph.Operation和Tensor. Session Session提供了O