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

相关推荐
无奇不有 不置可否13 分钟前
Java中的设计模式
java·开发语言·设计模式
金融数据出海22 分钟前
使用PHP对接东南亚、日本、印度和印度尼西亚股票数据源
android·开发语言·php
@Turbo@41 分钟前
【QT】一个界面中嵌入其它界面(二)
开发语言·数据库·qt
ALex_zry44 分钟前
C++ Kafka客户端(cppkafka)安装与问题解决指南
开发语言·c++·kafka
MessiGo1 小时前
Javascript 编程基础(2)基础知识 | 2.1、javascript与Node.js
开发语言·javascript·node.js
martian6651 小时前
掌握Python编程:从C++/C#/Java开发者到AI与医学影像开发专家
开发语言·人工智能·python·dicom
ktkiko111 小时前
顶层设计-IM系统架构
java·开发语言·系统架构
黑牛先生1 小时前
C++ 回调函数
开发语言·c++
thunder-11 小时前
C# 匹配模式
开发语言·c#
羑悻的小杀马特1 小时前
iOS:重新定义移动交互,引领智能生活新潮流
macos·ios·objective-c·cocoa·mac