ios - 合并:将 Closure 转换为 Publisher
问题描述
如何转换:
func getResults(completion: ([Result]?, Error) -> Void)
进入
var resultsPublisher: AnyPublisher<[Result], Error>
只是我看到的一个方案(这种语法不存在):
var resultsPublisher: AnyPublisher<[Result], Error> {
let publisher: AnyPublisher = ... // init
getResults { results, error in
guard let results = results else {
publisher.produce(error: error) // this syntax doesn't exist
return
}
publisher.produce(results: results) // this syntax doesn't exist
}
return publisher
}
我需要它,因为一些 3d 方 SDK 使用completion closures
并且我想为它们编写扩展返回Publishers
.
解决方案
答案是Future
Publishermatt
解释:
var resultsPublisher: AnyPublisher<[Result], Error> {
// need deferred when want
// to start request only when somebody subscribes
// + without Deferred it's impossible to .retry() later
Deferred {
Future { promise in
self.getResults { results, error in
guard let results = results else {
promise(.failure(error))
return
}
promise(.success(results))
}
}
}
.eraseToAnyPublisher()
}
推荐阅读
- javascript - 如何解决此 MarkerCluster 签入/签出错误(传单销售人员)?
- ads - 税务验证待定。苹果搜索广告
- java - 为什么BufferedImage没有根据paintComponent方法中绘制的矩形切割(它的高度计算错误)?
- c - 减去 malloc 返回的 2 个大小为零的指针
- c# - .Net 进程因 .net 运行时错误而终止。退出代码 e0004743
- java - 导入 com.datastax.spark.connector.CassandraJavaUtil 无法解析
- json - 当我在 laravel 的 json 列上使用 where 时返回空集合
- oracle - 将 DML 和 DDL 更改记录到指定表、模式或整个 oracle 数据库的正确方法
- html - 如何禁用切换按钮?
- git - git rebase --hard 之后,为什么我的主题分支没有变化?