Chary
Chary 是一个 DispatchQueue 工具库,用于更安全的同步和非同步编程。它有助于避免在处理多线程应用时出现竞争条件。
要求
- Swift 5.0 或更高版本(或使用 Swift Package Manager 时为 5.3)
- iOS 10.0 或更高版本
仅支持 Swift Package Manager
- macOS 10.0 或更高版本
- tvOS 10.10 或更高版本
安装
CocoaPods
Chary可通过CocoaPods获取。要安装它,只需将以下行添加到您的Podfile中
pod 'Chary'
从XCode通过Swift Package Manager
- 使用XCode菜单 文件 > Swift包 > 添加包依赖
- 将https://github.com/hainayanda/Chary.git添加为Swift包URL
- 在版本部分设置,选择直到下一个主要版本选项,并设置其版本为1.0.4
- 点击下一步并等待
从Package.swift通过Swift Package Manager
在Package.swift中将它作为目标依赖项添加
dependencies: [
.package(url: "https://github.com/hainayanda/Chary.git", .upToNextMajor(from: "1.0.4"))
]
在您的目标中使用Chary
.target(
name: "MyModule",
dependencies: ["Chary"]
)
作者
纳扬达·赫伯特,[email&protected]
授权
Pharos遵循MIT授权协议。更多信息请参阅LICENSE文件。
基本使用
Chary附带两个实用工具,Atomic
属性包装器和DispatchQueue
扩展
Atomic属性包装器
Atomic属性包装器是一种属性包装器,用于封装属性,以便可以原子地访问和编辑它
class MyClass {
@Atomic var atomicString: String = "atomicString"
...
...
}
然后,无论在何处访问或编辑,原子字符串都将线程安全。
DispatchQueue.main.async {
myClass.atomicString = "from main thread"
}
DispatchQueue.global().async {
myClass.atomicString = "from global thread"
}
DispatchQueue扩展
Chary包含一些有助于处理多线程的DispatchQueue扩展。
检查当前队列
您可以使用 isCurrentQueue(is:)
来检查当前 DispatchQueue
,该方法将检查提供的队列是否是当前队列。
myQueue = DispatchQueue(label: "myQueue")
myQueue.sync {
// this will print true
print(DispatchQueue.isCurrentQueue(is: myQueue))
}
// this will print false
print(DispatchQueue.isCurrentQueue(is: myQueue))
它的作用是注册提供的 DispatchQueue
以便检测,并将当前可检测的队列与提供的队列进行比较。
public static func isCurrentQueue(is queue: DispatchQueue) -> Bool {
queue.registerDetection()
return current == queue
}
调用 DispatchQueue.current
不一定能返回当前 DispatchQueue
,因为它只能返回已经注册用于检测的 DispatchQueue
。当调用 current
时,将自动注册一些默认的 DispatchQueue
。
DispatchQueue.main
DispatchQueue.global()
DispatchQueue.global(qos: .background)
DispatchQueue.global(qos: .default)
DispatchQueue.global(qos: .unspecified)
DispatchQueue.global(qos: .userInitiated)
DispatchQueue.global(qos: .userInteractive)
DispatchQueue.global(qos: .utility)
除此之外,您需要手动调用 registerDetection()
以允许 DispatchQueue
通过调用 DispatchQueue.current
来进行访问。由于 isCurrentQueue(is:)
将自动注册给定的 DispatchQueue
,因此,传递的队列将在之后可以通过 DispatchQueue.current
访问。
安全同步
从 DispatchQueue
运行 sync
有时可能会引发异常,如果它在同一个 DispatchQueue
中被调用。为了避免这个问题,您可以使用 safeSync
,它将首先检查当前队列,并决定是否需要立即运行代码块或使用默认的 sync
。您不需要注册 DispatchQueue
,因为它将在检查之前自动注册。
DispatchQueue.main.safeSync {
print("this will safely executed")
}
如有必要,异步执行
有时您想在正确的 DispatchQueue
中立即执行操作,而不是使用 async
将其异步运行。例如,当您更新 UI 时,如果您已经在 DispatchQueue.main
中,最好立即执行它而不是将其放入异步队列。您可以使用 asyncIfNeeded
来实现这种功能。它将检查当前 DispatchQueue
并决定是否需要立即运行或使用默认的 async
。您不需要注册 DispatchQueue
,因为它将在检查之前自动注册。
DispatchQueue.main.asyncIfNeeded {
print("this will executed right away or asynchronously if in different queue")
}
贡献
了解诀窍。只需克隆并发起一个拉取请求