测试已测试 | ✓ |
语言语言 | SwiftSwift |
许可 | MIT |
发布日期上次发布日期 | 2017年4月 |
SwiftSwift版本 | 3.0 |
SPM支持SPM | ✓ |
由Johan Sørensen维护。
Future的Swift实现,可以用于模型化和转换异步结果,同时使其轻松在调度队列之间传递结果
Eventually中的Future可以用于包装现有API,或者使用Future创建新API
func operation(completion: (Int) -> Void) {
DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(2)) {
completion(42)
}
}
Future<Int> { resolve in
operation { value
resolve.success(value)
}
}.then { result in
switch result {
case .success(let value):
print("value is", value) // "value is 42"
case .failure(let error):
print("something went wrong:", error)
}
}
初始化Future时,闭包将接收一个“解析器”,这个解析器本质上是一个闭包,您将使用一个FutureResult来调用它,这是一个Result枚举类型,可以是.success
或.failure
。
还有一些简写方法可供使用
func calculateAge() -> Future<Int> {
// ...
}
calculateAge().success { (value: Int) in
print("Success value from calling calculateAge() is", value)
}.failure { error in
print(The Future returned by calculateAge() gave us an error:", error)
}
还有非闭包 основанные API для разрешения будущеيين
let future = Future<Int>
future.success { value in
...
}
future.resolve(success: age)
使用Eventually可以将一个Future类型映射到另一个类型,这使得我们可以轻松地组合和转换事物
calculateAge().map({ (value: Int) -> String in
return "Age is \(age)"
}).success { value in
print(value) // "Age is 42"
}
与以往一样,可以实现链接,因此可以执行多个转换
大多数操作Future的方法接受一个EvaluationContext,该上下文描述了操作应在哪个GCD队列上调用
Future<String>(on: .background) { resolve
// Performed on a background queue (eg `DispatchQueue.global(qos: .background)`)
resolve.success("hello"))
}.map(on: .queue(someCustomQueue)) { value in
// will be called on the supplied DispatchQueue (`someCustomQueue`)
return value + " world"
}.map(on: .main) { value in
// Mapping occurs on the main thread
let label = UILabel()
label.text = value
return text
}.success { label in
// default is the `.main` context
self.view.addSubview(label)
}
Eventually可以作为CocoaPods(pod 'Eventually'
)和Swift Package Manager使用。也可以通过将Eventually.xcodeproj拖入项目或通过Carthage来安装框架。
Eventually除了Foundation和Dispatch(GCD)外没有其他依赖项
请参阅LICENSE文件