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

相关推荐
草莓熊Lotso13 小时前
C++ STL set 系列完全指南:从底层原理、核心接口到实战场景
开发语言·c++·人工智能·经验分享·网络协议·算法·dubbo
咖啡の猫15 小时前
搭建Python开发环境
开发语言·python
程序猿小蒜16 小时前
基于springboot的共享汽车管理系统开发与设计
java·开发语言·spring boot·后端·spring·汽车
听风吟丶17 小时前
Java 8 Stream API 高级实战:从数据处理到性能优化的深度解析
开发语言·python
hygge99918 小时前
Spring Boot + MyBatis 整合与 MyBatis 原理全解析
java·开发语言·经验分享·spring boot·后端·mybatis
RickeyBoy19 小时前
Swift 6 迁移常见 crash: _dispatch_assert_queue_fail
swiftui·swift
Run_Teenage19 小时前
C++:智能指针的使用及其原理
开发语言·c++·算法
码界奇点20 小时前
Java设计模式精讲从基础到实战的常见模式解析
java·开发语言·设计模式·java-ee·软件工程
四维碎片20 小时前
【Qt】配置安卓开发环境
android·开发语言·qt
西游音月21 小时前
(7)框架搭建:Qt实战项目之主窗体导航栏、状态栏
开发语言·qt