Chary 1.0.7

Chary 1.0.7

nayanda1 维护。



Chary 1.0.7

  • 作者
  • Nayanda Haberty

Chary

Chary 是一个 DispatchQueue 工具库,用于更安全的同步和非同步编程。它有助于避免在处理多线程应用时出现竞争条件。

Codacy Badge build test SwiftPM Compatible Version License Platform

要求

  • 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")
}

贡献

了解诀窍。只需克隆并发起一个拉取请求