【问题标题】:Making custom Deffered Future Publisher in Swift Combine?在 Swift Combine 中制作自定义延迟未来发布者?
【发布时间】:2021-12-08 21:00:09
【问题描述】:

就像标题所说的那样,我想制作自定义发布者,其功能基本上类似于延迟未来。通常,当我想将代码封装在某个 Future 中,但希望它在订阅时执行时,我需要编写如下内容:

Deffered {
    Future { promise in
    }
}

现在我正在考虑制作自定义发布者,类似于 DeferedFuture 的东西,它具有与 Future 完全相同的功能,但只会在订阅时执行承诺?

【问题讨论】:

  • 既然这正是 deferred future 已经在做的事情,那么您需要什么新功能?
  • 我想把它写成一个发布者,不是 Defered { Future {} },只是 NewDefferedFuture {}。

标签: swift combine


【解决方案1】:

最明显的答案是这样的:

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)
        }
    }
}

【讨论】:

  • 对于更通用的解决方案,您可以使用Ian Keen's AnyPubliser extension,这将允许您在完成之前发出多个值。未来不允许的事情。
  • 谢谢,一定是类型,第二部分解决了
猜你喜欢
  • 1970-01-01
  • 2020-11-06
  • 1970-01-01
  • 2021-05-25
  • 1970-01-01
  • 2021-02-24
  • 1970-01-01
  • 1970-01-01
  • 2020-08-05
相关资源
最近更新 更多