Combine 系列
- Swift Combine 从入门到精通一
- Swift Combine 发布者订阅者操作者 从入门到精通二
- Swift Combine 管道 从入门到精通三
- Swift Combine 发布者publisher的生命周期 从入门到精通四
- Swift Combine 操作符operations和Subjects发布者的生命周期 从入门到精通五
- Swift Combine 订阅者Subscriber的生命周期 从入门到精通六
- Swift 使用 Combine 进行开发 从入门到精通七
- Swift 使用 Combine 管道和线程进行开发 从入门到精通八
- Swift Combine 使用 sink, assign 创建一个订阅者 从入门到精通九
- Swift Combine 使用 dataTaskPublisher 发起网络请求 从入门到精通十
1. 用 Future 来封装异步请求以创建一次性的发布者
目的:使用 Future 将异步请求转换为发布者,以便在 Combine 管道中使用返回结果。
import Contacts
let futureAsyncPublisher = Future<Bool, Error> { promise in // 1
CNContactStore().requestAccess(for: .contacts) { grantedAccess, err in // 2
// err is an optional
if let err = err { // 3
return promise(.failure(err))
}
return promise(.success(grantedAccess)) // 4
}
}.eraseToAnyPublisher()
- Future 本身由你定义返回类型,并接受一个闭包
promise
。 它给出一个与类型描述相匹配的 Result 对象,你可以与之交互。 - 只要传入的闭包符合类型要求,任何异步的 API 你都可以调用。
- 在异步 API 完成的回调中,由你决定什么是失败还是成功。 对
promise(.failure(<FailureType>))
的调用返回一个失败的结果。 - 或者调用
promise(.success(<OutputType>))
返回一个值。
Future 在创建时立即发起其中异步 API 的调用,而不是 当它收到订阅需求时。 这可能不是你想要或需要的行为。 如果你希望在订阅者请求数据时再发起调用,你可能需要用 Deferred 来包装 Future。
如果您想返回一个已经被解析的 promise
作为 Future
发布者,你可以在闭包中立即返回你想要的结果。
以下示例将单个值 true
返回表示成功。 你同样可以简单地返回 false
,发布者仍然会将其作为一个成功的 promise
。
let resolvedSuccessAsPublisher = Future<Bool, Error> { promise in
promise(.success(true))
}.eraseToAnyPublisher()
一个返回 Future
发布者的例子,它立即将 promise
解析为错误。
enum ExampleFailure: Error {
case oneCase
}
let resolvedFailureAsPublisher = Future<Bool, Error> { promise in
promise(.failure(ExampleFailure.oneCase))
}.eraseToAnyPublisher()
参考
https://heckj.github.io/swiftui-notes/index_zh-CN.html
代码
https://github.com/heckj/swiftui-notes