iOS多线程-GCD

前言 Hi Coder,我是 CoderStar! 今天给大家带来多线程系列的第二篇文章 – GCD,其大概率是我们在使用多线程时最常用的方式了。 GCD 全称是 Grand Central Dispatch,翻译过来就是大规模中央调度。根据官方文档,它的作用是:通过向系统管理的调度队列中提交任务,在多核硬件上同时执行代码。它提供了一套机制,让你可以充分利用硬件的多核性能,并且让你不用再调用那些繁琐的底层线程 API,编写易于理解和修改的代码。 对开发者而言,面对的不再是上一篇文章 iOS多线程-Thread 所描述的线程,CGD 将线程概念模糊掉,开发者转而面对的是更上层的队列和任务,不再需要考虑线程的周期以及调度等等,这些交由 GCD 内部处理就好。 本文对一些概念性的东西可能会一笔带过,主要介绍日常开发的一些经验。同时更多细节大家可以看苹果开源出来关于 GCD 的源码 –swift-corelibs-libdispatch,同时我们通过源码也能了解到 GCD 的底层 API 都是用 C 写的。 队列 一般情况下我们可以将队列分为串行和并行两种,其中主队列是一种特殊的串行队列,全局队列是一组特殊的并行队列。 构造函数 下列为队列的构造函数 1 2 3 4 5 public convenience init(label: String, qos: DispatchQoS = .unspecified, attributes: DispatchQueue.Attributes = [], autoreleaseFrequency: DispatchQueue.AutoreleaseFrequency = .inherit, target: DispatchQueue? = nil) 介绍一下各个参数的作用: ...

November 16, 2024 · 5 min · 1017 words · CoderStar

iOS多线程-Operation

前言 Hi Coder,我是 CoderStar! 我们之前已经讲过 iOS多线程-Thread 以及 iOS多线程-GCD,我们今天来聊一聊 iOS 多线程中最后一种比较常用的方式 –Operation。 概览 对于 Operation 而言,其相关的类比 GCD 要少的多。Operation 本身是一个 抽象类,不能直接进行使用,其定义了相关的方法及属性,需要靠子类进行相应的实现,系统已经实现了一个 –BlockOperation。(在 OC 中,还有一个是 NSInvocationOperation,但在 Swift 中,该子类已经在 Swift4 里去掉,想必去掉的原因大家也很容易理解,因为 Swift 语言本身就不推荐 selector 这种形式)。 Operation 底层建立在 GCD 之上,是更高一级的抽象,使我们可以面向对象(Cocoa 对象)的方式进行多线程编程。 其实 NSOpertion 是先于 GCD 引进的,在当时,NSOperationQueue 接收 NSOperation 对象并创建一个线程,然后在该线程上运行 main 方法 ,运行完成之后再杀死该线程。这种方式相对于后面出现的 GCD 底层的线程池而言,效率就很低,所以在 Mac OS 10.5 以及 iOS 2 开始便对 NSOpertion 底层在基于 GCD 的基础上进行完全重写,利用 GCD 的相关特性提高性能并提供了一些新功能。如果想简单佐证下,可以看到 OperationQueue 拥有一个 unowned(unsafe) open var underlyingQueue: DispatchQueue? 属性。 如果大家对 Operation 底层实现比较有兴趣,可以在开源的 Foundtion 框架中查看 Operation.swift。 ...

November 16, 2024 · 6 min · 1080 words · CoderStar

iOS多线程-Thread

前言 Hi Coder,我是 CoderStar! 多线程是 iOS 中一个重要的知识点,常见的技术包含 Thread GCD Operation Pthreads 其中前三种方式我们比较常用,其中 GCD、Operation 使用的最频繁。Pthreads 是基于 C 语言的框架,可以跨平台使用,我们平时使用比较少。 作为多线程系列的开篇,今天我们先来讲讲 Thread,虽然它用的比较少也比较简单,但还是需要我们掌握了解的。 Thread 相对 GCD、Operation 而言使用起来比较轻量级。其管理的基本单位就是线程,每一个 Thread 都对应一个线程。 需要自己管理线程的生命周期、线程同步、加锁、睡眠以及唤醒等。 Thread 的创建方式 Thread 的创建有多种方式。 类方法 1 2 3 4 @available(iOS 10.0, *) open class func detachNewThread(_ block: @escaping () -> Void) open class func detachNewThreadSelector(_ selector: Selector, toTarget target: Any, with argument: Any?) 类方法创建的线程自动运行,通过这种方式我们无法对 Thread 属性进行一些自定义的设置,如 name、threadPriority 等。 ...

November 16, 2024 · 2 min · 359 words · CoderStar