AwaitKit 5.2.0

AwaitKit 5.2.0

测试已测试
语言语言 SwiftSwift
许可 MIT
发布最新发布2019年7月
SPM支持 SPM

Yannick Loriot 维护。




AwaitKit 5.2.0

AwaitKit

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

您曾经梦想过像同步代码那样编写异步代码吗?

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

自定义队列

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.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

特此免费授予任何人获得此软件及其相关文档(以下简称“软件”)副本(“软件”)的权利,不受限制地处理该软件,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或出售软件副本的权利,以及授权获得软件的人执行上述操作的权利,只要遵守以下条件

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

该软件“按原样”提供,不提供任何形式的保证,明示或暗示,包括但不限于适销性、特定目的适用性和非侵权性保证。在任何情况下,作者或版权所有者均不对任何主张、损害或其他责任负责,无论是在合同、侵权或其他方式中产生的,无论是否与该软件或该软件的使用或其他操作相关。