AwaitKit

Carthage Compatible Supported Platforms Version Build Status codecov.io codebeat badge Awesome

你是否梦想过像编写同步代码一样编写异步代码?

AwaitKit 是一个强大的 Swift 库,灵感来源于 ES8 (ECMAScript 2017) 中的 Async/Await 规范,它提供了一种以顺序方式编写异步代码的强大方法。

其内部使用 PromiseKit v6.10 来创建和管理 promise。

要求开始使用用法安装贡献联系方式许可证

要求

开始使用

如果你想快速了解项目概况,请查看这篇 博客文章

简单来说,这样写

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

async 方法将执行权交给它的闭包,该闭包将在后台队列中运行,并返回一个 promise,该 promise 将在此代码块结束时被 resolve。

这是一个小例子

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 返回一个以 user 作为值的 promise。如果 async 代码块结束时被执行,promise 将会被 resolve;否则,如果在 async 代码块内部发生错误,promise 将会因相应的错误而被 reject。

async 代码块会捕获抛出的错误来 reject promise,因此你不需要管理 await 异常。 但如果需要,你可以

async {
  do {
    try await(self.loginOrThrown(username: "yannickl"))
  }
  catch {
    print(error)
  }

  try await(self.clearCache())
}

Await

await 方法将执行给定的 promise 或代码块,并等待直到它被 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)
}

自定义队列

asyncawait 方法默认在后台并发队列上运行。 当然,你可以选择你自己的队列并调用以下方法

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 Manager 通过将正确的描述添加到你的 Package.swift 文件来安装 AwaitKit

import PackageDescription

let package = Package(
    name: "YOUR_PROJECT_NAME",
    dependencies: [
        .Package(url: "https://github.com/yannickl/AwaitKit.git")
    ]
)

请注意,Swift Package Manager 仍处于早期设计和开发阶段,有关更多信息,请查看其 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

特此授予许可,免费授予任何获得本软件及相关文档文件(“软件”)副本的人员,在不受限制的情况下处理本软件,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或出售本软件副本的权利,并允许向其提供本软件的人员这样做,但须符合以下条件

上述版权声明和本许可声明应包含在本软件的所有副本或主要部分中。

本软件按“原样”提供,不提供任何形式的明示或暗示的保证,包括但不限于适销性、特定用途的适用性和非侵权性的保证。在任何情况下,作者或版权持有人均不对任何索赔、损害或其他责任负责,无论是在合同诉讼、侵权行为或其他方面,由本软件或本软件的使用或其他交易引起、产生或与之相关。