多线程在Swift中也是首先使用GCD。
一、异步
1.1. GCD开启异步线程
示例代码:
1 | class ViewController: UIViewController { |
提示:之前OC中很多类都是
NS
前缀,但是Swift中和OC对等的类名大部分把NS
去掉了。
1.2. GCD任务-DispatchWorkItem
DispatchWorkItem
是定义任务的,任务完成后可以通过notify
通知其他线程(一般是主线程)做其他任务。
示例代码:
1 | // 定义任务 |
二、延迟
2.1 普通延迟
在iOS中使用延迟一般使用dispatch_after
,但是在Swift中没有这个API,使用的是DispatchQueue.*.asyncAfter
。
示例代码:
1 | @discardableResult |
2.2. 异步延迟
示例代码(定义函数):
1 | @discardableResult |
示例代码(使用):
1 | class ViewController: UIViewController { |
为什么定义延迟异步时函数要返回DispatchWorkItem
?是因为有可能需要对任务做取消或其他操作。
三、once
dispatch_once
在Swift中已被废弃,取而代之的是静态属性(底层还是调用了dispatch_once
)。
示例代码:
1 | class ViewController: UIViewController { |
四、加锁
当很多资源同时访问同一块数据的时候,可能会发生抢夺资源的情况,这时候需要一个加锁机制,当上次任务还未结束时,等待到任务完成才能继续下一次任务。
示例代码:
1 | public struct Cache { |
lock.wait()
是加锁,lock.signal()
是取消锁(解锁)。加锁的API还有很多:NSLock、NSRecursiveLock
等等,使用起来都很简单(只需要注意死锁问题即可)。