您曾经梦想过像同步代码那样编写异步代码吗?
AwaitKit 是一个由 ES8 (ECMAScript 2017) 中的 Async/Await 规范 启发的强大 Swift 库,它以一种顺序化的方式提供了一种强大的编写异步代码的方法。
它内部使用 PromiseKit v6.10 来创建和管理 Promise。
要求 • 快速入门 • 使用方法 • 安装 • 贡献 • 联系方式 • 许可
要求
- iOS 8.0+
- Xcode 8.0+
- Swift 4.0+
快速入门
如果您想快速了解项目,请查看这篇 博客文章。
简而言之,写下这个
let user = try! await(signIn(username: "Foo", password: "Bar"))
try! await(sendWelcomeMailToUser(user))
try! await(redirectToThankYouScreen())
print("All done!")
而不是这个
signIn(username: "Foo", password: "Bar")
.then { user in
return self.sendWelcomeMailToUser(user)
}
.then { _ in
return self.redirectToThankYouScreen()
}
.then { _ in
print("All done!")
}
或者更糟糕的是,使用嵌套的完成回调“地狱式”风格
signIn(username: "Foo", password: "Bar") { user in
self.sendWelcomeMailToUser(user) { _ in
self.redirectToThankYouScreen() { _ in
print("All done!")
}
}
}
使用方法
异步
async
方法将执行权交给其闭包,该闭包将在后台队列中运行,并返回一个在块尾解决(resolve)的承诺(promise)。
这里有一个小程序例。
func setupNewUser(name: String) -> Promise<User> {
return async {
let newUser = try await(self.createUser(name))
let friends = try await(self.getFacebookFriends(name))
newUser.addFriends(friends)
return newUser
}
}
在这里,setupNewUser
返回一个包含用户值的承诺。如果执行到 async
块的末尾,承诺将被解决,否则如果在异步块内部出现错误,则承诺将因对应的错误而拒绝(reject)。
async
块将捕获抛出的错误以拒绝承诺,这样就不需要管理 await
异常。但如果有必要,你可以
async {
do {
try await(self.loginOrThrown(username: "yannickl"))
}
catch {
print(error)
}
try await(self.clearCache())
}
await
await
方法将执行给定的承诺或块,并等待其解决(resolve)或失败。
do {
let name: String = try await {
Thread.sleep(forTimeInterval: 0.2)
if Int(arc4random_uniform(2) + 1) % 2 == 0 {
return "yannickl"
}
else {
throw NSError()
}
}
print(name)
}
catch {
print(error)
}
自定义队列
async
和 await
方法默认在后台并发队列上运行。当然,您可以选择自己的队列并调用以下方法
DispatchQueue.global(qos: .default).ak.async {
}
try DispatchQueue.global(qos: .default).ak.await {
}
当您使用这些方法并执行异步操作时,请在主线程中不要做任何操作,否则您可能会遇到死锁情况。
安装
如果您想在自己的项目中使用 AwaitKit,建议使用 CocoaPods 包管理器,因为它提供了灵活的依赖管理以及简单的安装过程。
CocoaPods
如果尚未安装,请安装 CocoaPods
$ [sudo] gem install cocoapods
$ pod setup
进入您的 Xcode 项目目录,创建并编辑您的 Podfile,并添加 AwaitKit
$ cd /path/to/MyProject
$ touch Podfile
$ edit Podfile
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '8.0'
pod 'AwaitKit', '~> 5.2.0'
将安装到您的项目中
$ pod install
如果 CocoaPods 没有找到 PromiseKit 6.10
依赖,请执行以下命令
$ pod repo update
使用 .xcworkspace 文件(而非通常的项目文件)在 Xcode 中打开您的项目
$ open MyProject.xcworkspace
Swift Package Manager
您可以使用 Swift 包管理器 通过在您的 Package.swift
文件中添加适当的描述来安装 AwaitKit
import PackageDescription
let package = Package(
name: "YOUR_PROJECT_NAME",
dependencies: [
.Package(url: "https://github.com/yannickl/AwaitKit.git")
]
)
请注意,Swift 包管理器 仍在早期设计和开发中,更多信息请访问其 GitHub 页面。
Carthage
Carthage 是一个去中心化的依赖管理器,它构建您的依赖并为您提供二进制框架。
您可以使用以下命令使用 Homebrew 安装 Carthage
$ brew update
$ brew install carthage
要使用 Carthage 将 AwaitKit 集成到您的 Xcode 项目中,请在您的 Cartfile
中指定它
github "yannickl/AwaitKit" ~> 5.2.0
运行 carthage update
来构建框架,并将构建的 AwaitKit.framework
拖入您的 Xcode 项目。
手动方式
下载 项目并将 AwaitKit
文件夹复制到您的项目中以使用它。注意您还需要下载 PromiseKit v6.7 库并将其导入到您的项目中。
贡献
欢迎并鼓励贡献 ♡。
联系
Yannick Loriot
许可(MIT)
版权所有(c)2016-至今 - Yannick Loriot
特此免费授予任何人获得此软件及其相关文档(以下简称“软件”)副本(“软件”)的权利,不受限制地处理该软件,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或出售软件副本的权利,以及授权获得软件的人执行上述操作的权利,只要遵守以下条件
上述版权声明和本许可声明应包含在软件的任何副本或主要部分中。
该软件“按原样”提供,不提供任何形式的保证,明示或暗示,包括但不限于适销性、特定目的适用性和非侵权性保证。在任何情况下,作者或版权所有者均不对任何主张、损害或其他责任负责,无论是在合同、侵权或其他方式中产生的,无论是否与该软件或该软件的使用或其他操作相关。