Swift Combine 用 Future 来封装异步请求 从入门到精通十一

Combine 系列

  1. Swift Combine 从入门到精通一
  2. Swift Combine 发布者订阅者操作者 从入门到精通二
  3. Swift Combine 管道 从入门到精通三
  4. Swift Combine 发布者publisher的生命周期 从入门到精通四
  5. Swift Combine 操作符operations和Subjects发布者的生命周期 从入门到精通五
  6. Swift Combine 订阅者Subscriber的生命周期 从入门到精通六
  7. Swift 使用 Combine 进行开发 从入门到精通七
  8. Swift 使用 Combine 管道和线程进行开发 从入门到精通八
  9. Swift Combine 使用 sink, assign 创建一个订阅者 从入门到精通九
  10. Swift Combine 使用 dataTaskPublisher 发起网络请求 从入门到精通十

1. 用 Future 来封装异步请求以创建一次性的发布者

目的:使用 Future 将异步请求转换为发布者,以便在 Combine 管道中使用返回结果。

swift 复制代码
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()
  1. Future 本身由你定义返回类型,并接受一个闭包promise。 它给出一个与类型描述相匹配的 Result 对象,你可以与之交互。
  2. 只要传入的闭包符合类型要求,任何异步的 API 你都可以调用。
  3. 在异步 API 完成的回调中,由你决定什么是失败还是成功。 对 promise(.failure(<FailureType>)) 的调用返回一个失败的结果。
  4. 或者调用 promise(.success(<OutputType>)) 返回一个值。

Future 在创建时立即发起其中异步 API 的调用,而不是 当它收到订阅需求时。 这可能不是你想要或需要的行为。 如果你希望在订阅者请求数据时再发起调用,你可能需要用 Deferred 来包装 Future。

如果您想返回一个已经被解析的 promise 作为 Future 发布者,你可以在闭包中立即返回你想要的结果。

以下示例将单个值 true 返回表示成功。 你同样可以简单地返回 false,发布者仍然会将其作为一个成功的 promise

swift 复制代码
let resolvedSuccessAsPublisher = Future<Bool, Error> { promise in
    promise(.success(true))
}.eraseToAnyPublisher()

一个返回 Future 发布者的例子,它立即将 promise 解析为错误。

swift 复制代码
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

相关推荐
忆江南7 小时前
iOS 深度解析
flutter·ios
没有故事的Zhang同学7 小时前
05-主题|事件响应者链@iOS-应用场景与进阶实践
ios
FeliksLv14 小时前
尝试给Lookin 支持 MCP
ios
没有故事的Zhang同学14 小时前
01-研究系统框架@Web@iOS | JavaScriptCore 框架:从使用到原理解析
ios
CocoaKier2 天前
苹果谷歌商店:如何监控并维护用户评分评论
ios·google·apple
iOS日常2 天前
iOS设备崩溃日志获取与查看
ios·xcode
wangruofeng3 天前
AI 助力 Flutter 3.27 升级到 3.38 完整指南:两周踩坑与实战复盘
flutter·ios·ai编程
iOS日常3 天前
Xcode 垃圾清理
ios·xcode
开心就好20253 天前
不越狱能抓到 HTTPS 吗?在未越狱 iPhone 上抓取 HTTPS
后端·ios
傅里叶4 天前
iOS相机权限获取
flutter·ios