最终版本 0.4

Eventually 0.4

测试已测试
语言语言 SwiftSwift
许可 MIT
发布日期上次发布日期2017年4月
SwiftSwift版本3.0
SPM支持SPM

Johan Sørensen维护。



  • 作者
  • Johan Sørensen

Eventually logo

Eventually

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文件