PromiseKit

badge-pod badge-languages badge-pms badge-platforms codecov


Promises 简化了异步编程,让您可以专注于更重要的事情。它们易于学习,易于掌握,并能产生更清晰、更易读的代码。您的同事会感谢您。

UIApplication.shared.isNetworkActivityIndicatorVisible = true

let fetchImage = URLSession.shared.dataTask(.promise, with: url).compactMap{ UIImage(data: $0.data) }
let fetchLocation = CLLocationManager.requestLocation().lastValue

firstly {
    when(fulfilled: fetchImage, fetchLocation)
}.done { image, location in
    self.imageView.image = image
    self.label.text = "\(location)"
}.ensure {
    UIApplication.shared.isNetworkActivityIndicatorVisible = false
}.catch { error in
    self.show(UIAlertController(for: error), sender: self)
}

PromiseKit 是一个经过深思熟虑且完整的 Promises 实现,适用于任何具有 swiftc 的平台。它具有出色的 Objective-C 桥接,以及针对 iOS、macOS、tvOS 和 watchOS 的令人愉悦的专业化功能。它是一个排名前 100 的 pod,被用于世界上许多最受欢迎的应用程序中。

codecov

快速开始

在您的 Podfile

use_frameworks!

target "Change Me!" do
  pod "PromiseKit", "~> 8"
end

PromiseKit 8 支持最新的 Xcodes (13+)。一些 Podspec 已经被移除。欢迎提交 Pull Requests。

PromiseKit 6、5 和 4 支持 Xcode 8.3、9.x 和 10.0;Swift 3.1、3.2、3.3、3.4、4.0、4.1、4.2、4.3 和 5.0 (开发快照);iOS、macOS、tvOS、watchOS、Linux 和 Android;CocoaPods、Carthage 和 SwiftPM;(CI Matrix)。

对于 Carthage、SwiftPM、Accio 等,或者在使用较旧的 Swift 或 Xcode 时的说明,请参阅我们的 安装指南。我们推荐 CarthageAccio

PromiseKit 和 Swift 5.5+ Async/Await

从 Swift 5.5 开始,Swift 语言现在提供对 使用 async / await 的内置并发 的支持。请参阅 Async+,它将 PromiseKit 最有用的模式移植到了这种新范例中。

现在提供专业支持的 PromiseKit

TideLift 为软件开发团队提供了一个单一来源,用于购买和维护他们的软件,并从最了解它的专家那里获得专业级别的保证,同时与现有工具无缝集成。

通过 TideLift 获取 PromiseKit 的专业支持.

文档

扩展

Promises 的作用仅取决于它们所代表的异步任务。因此,我们已将(几乎)所有 Apple 的 API 转换为 promises。默认的 CocoaPod 提供 Promises 和 Foundation 和 UIKit 的扩展。可以通过在您的 Podfile 中指定其他 subspecs 来获得其他扩展,例如:

pod "PromiseKit/MapKit"          # MKDirections().calculate().then { /*…*/ }
pod "PromiseKit/CoreLocation"    # CLLocationManager.requestLocation().then { /*…*/ }

我们所有的扩展都在 PromiseKit 组织 中的单独存储库中。

我不想要这些扩展!

那就不要使用它们

pod "PromiseKit/CorePromise", "~> 8"

注意: 默认情况下,Carthage 安装不包含任何扩展。

网络

Promise 链通常从网络操作开始。因此,我们为 URLSession 提供了扩展

// pod 'PromiseKit/Foundation'  # https://github.com/PromiseKit/Foundation

firstly {
    URLSession.shared.dataTask(.promise, with: try makeUrlRequest()).validate()
    // ^^ we provide `.validate()` so that eg. 404s get converted to errors
}.map {
    try JSONDecoder().decode(Foo.self, with: $0.data)
}.done { foo in
    //…
}.catch { error in
    //…
}

func makeUrlRequest() throws -> URLRequest {
    var rq = URLRequest(url: url)
    rq.httpMethod = "POST"
    rq.addValue("application/json", forHTTPHeaderField: "Content-Type")
    rq.addValue("application/json", forHTTPHeaderField: "Accept")
    rq.httpBody = try JSONEncoder().encode(obj)
    return rq
}

欢迎支持 Alamofire,请提交 PR。

支持

请查看我们的 故障排除指南,如果在那之后您仍然有问题,请在我们的 Gitter 聊天频道我们的 bug 跟踪器 上提问。

安全与漏洞报告或披露

https://tidelift.com/security