在 Swift Combine 中制作自定义延迟未来发布者?
Making custom Deffered Future Publisher in Swift Combine?
就像标题所说的那样,我想制作一个基本上可以像延迟未来一样运行的自定义发布者。通常当我想在一些 Future 中封装代码,但希望它在订阅时执行,我需要写这样的东西:
Deffered {
Future { promise in
}
}
现在我正在考虑制作自定义发布者,类似于 DefferedFuture 的东西,它具有与 Future 完全相同的功能,但只会在订阅时执行承诺?
最明显的答案是:
func single<Output, Failure>(_ promise: @escaping (@escaping (Result<Output, Failure>) -> Void) -> Void) -> Deferred<Future<Output, Failure>> where Failure: Error {
Deferred {
Future<Output, Failure>(promise)
}
}
如果它绝对必须是类型而不是函数,那么:
extension Publishers {
struct Single<Output, Failure>: Publisher where Failure: Error {
let promise: (@escaping (Result<Output, Failure>) -> Void) -> Void
func receive<S>(subscriber: S) where S: Subscriber, Failure == S.Failure, Output == S.Input {
Deferred { Future(promise) }
.subscribe(subscriber)
}
}
}
就像标题所说的那样,我想制作一个基本上可以像延迟未来一样运行的自定义发布者。通常当我想在一些 Future 中封装代码,但希望它在订阅时执行,我需要写这样的东西:
Deffered {
Future { promise in
}
}
现在我正在考虑制作自定义发布者,类似于 DefferedFuture 的东西,它具有与 Future 完全相同的功能,但只会在订阅时执行承诺?
最明显的答案是:
func single<Output, Failure>(_ promise: @escaping (@escaping (Result<Output, Failure>) -> Void) -> Void) -> Deferred<Future<Output, Failure>> where Failure: Error {
Deferred {
Future<Output, Failure>(promise)
}
}
如果它绝对必须是类型而不是函数,那么:
extension Publishers {
struct Single<Output, Failure>: Publisher where Failure: Error {
let promise: (@escaping (Result<Output, Failure>) -> Void) -> Void
func receive<S>(subscriber: S) where S: Subscriber, Failure == S.Failure, Output == S.Input {
Deferred { Future(promise) }
.subscribe(subscriber)
}
}
}