IOS开发(56)之并发简介
1 前言
并发在程序设计中比比皆是,如何能在ios开发中更好的运用并发已经成为一个关键问题,今天我们就简单的来介绍一下并发。
2 正文
当两个或两个以上的任务同时执行时就发生了并发。即使只有一个 cpu,现代操作也能够在同时执行多个任务。
grand central dispatch,或者简称 gcd(*调度),是一个与 block object 产生工作的低级的 c api。gcd 真正的用途是将任务分配到多个核心又不让程序员担心哪个内核执行哪个任务。
gcd 的核心是分派队列。不论在 ios 还是 max os x 分派队列,正如我们快看到的是由位于主操作系统的 gcd 来管理的线程池。你不会直接与线程有工作关系。你只在分派队列上工作,将任务分派到这个队列上并要求队列来调用你的任务。gcd 为运行任务提供了几个选择:同步执行、异步执行和延迟执行等。
要在你的 app 开始使用 gcd,你没有必要将任何特殊库导入你的项目。apple 已经在 gcd 中纳入了各种框架,包括 core foundation 和 cocoa/cocoa touch。gcd 中的所有方法和数据类型都以 dispatch_关键词开头。例如,dispatch_async 允许你在一个队列上分派任务来异步执行,而 dispatch_after 允许你在一个给定的延迟之后运行一个 block。传统上,程序员必须创建自己的线程来并行执行任务。
我们会一直和分派队列打交道,所以请确保你完全理解了其背后的概
念。有 3 种分派队列:
main queue
这个队列在主线程上执行它的所有任务,cocoa 和 cocoa touch 允许程序员在主线程上调用一切 ui-related 方法。使用 dispatch_get_main_queue 函数检索到主队列的句柄。
concurrent queues
为了执行异步和同步任务,你可以在 gcd 中检索到这写队列。多个并发队列能够轻而易举的并行执行多
这些允许你在另一个当前存在的对象中调用一个方法。
个任务,没有更多的线程管理,酷!使用 dispatch_get_global_queue 函数检索一个并发队列的句柄。
serial queues
无论你提交同步或者异步任务,这些队列总是按照先入先出(fifo)的原则来执行任务,这就意味着它们一次执行一个 block object。然而,他们不在主线程上运行,所以对于那些要按照严格顺序执行并不阻塞主线程的任务而言是一个完美的选择。使用 dispatch_queue_create 函数创建一个串行队列。一旦你使用完整队列,必须使用 dispatch_release 函数释放它。
block object 是通常在 objective-c 中以方法形式出现的代码包。block objects 和 gcd 共同创建了一个和谐环境,在这个环境里你能在 ios 和 mac os x 上发布高性能的多线程 apps。block objects 和 gcd 有什么特别的地方呢?你可能会问。很简单:没有太多的线程!所有你要做的事情就是把代码放进 block objects 然后要求 gcd 来为你小心执行代码。
gcd 与 block objects 一起工作。当使用 gcd 执行任务时,你可以传递一个 block object,它可以同步或者异步执行,取决于你在 gcd 中使用的方法。然而,你可以创建一个 block object 负责下载一个作为参数传递到它的 url。单独的 block object 可以同步或者异步应用于 app 的任何地方,这个位置依赖于你想如何运行它。你不必使 block object 本身同步或异步,你只要简单通过同步或者异步的 gcd 方法来调用它,它就会工作。
操作可以同步或者异步执行代码块。你可以手动管理操作或者是把它们放到操作队列中,这个队列会促使
并发以致于你不需要思考底层线程管理。
cocoa 提供了 3 种不同的操作:
block operations
它们促使执行一个或多个 block objects.
invocation operations
这些允许你在另一个当前存在的对象中调用一个方法。
plain operations
这些都是需要被继承普通操作的类。将要执行的代码会被写入操作对象的主要方法中。
当 app 在 ios 上运行时,操作系统为 app 创建了至少一个线程,称作主线程,每个线程必须添加到一个运行循环中。运行循环,顾名思义,是一个循环过程中的不同事件可以发生,如触发计时器或运行线程。
将运行循环想象成一种有一个开始点、一个完成条件和一系列在其生命周期内发生的事件的循环。一个线程或者计时器与一个运行附加到运行循环,事实上需要运行循环激活其功能。
一个 app 的主线程是处理 ui 事件的线程。如果你在主线程执行一个长时间运行的任务,就要注意 app的 ui 会没有响应或者响应缓慢。为了避免这一点,你可以创建一个独立线程和/或计时器,它们会分别执行各自的任务(即使是一个长时间运行的任务)同时又不会阻塞主线程。
3 结语
以上是对并发的简单介绍,希望能帮大家入门理解有所帮助。
下一篇: 软硬一体化 甲骨文将全力进军云计算领域