从 PromiseKit 包装迁移
Posted
技术标签:
【中文标题】从 PromiseKit 包装迁移【英文标题】:Migrating from PromiseKit wrap 【发布时间】:2018-12-16 16:28:17 【问题描述】:我正在尝试摆脱代码中的一些警告,并且似乎无法从 PromiseKit 的 wrap
迁移出去。具体来说,在 6.0 版本中,我不应该使用它,而应该使用 init(resolver:)
。
我有一个函数:
func foo(arg1: Int, arg2: Int, completionHandler: @escaping () -> ())
以下工作正常:
wrap( foo(arg1: val1, arg2: val2, completionHandler: $0) )
我尝试将其更改为(发行说明建议的内容):
Promise foo(arg1: val1, arg2: val2, completionHandler: $0.resolve)
这产生了一个错误Generic parameter 'T' could not be inferred
,所以我尝试修复它:
Promise<Void> foo(arg1: val1, arg2: val2, completionHandler: $0.resolve)
但这引发了另一个错误Unable to infer closure type in the current context
,我不确定从那里去哪里。
【问题讨论】:
【参考方案1】:下面是用于wrap
方法的deprecated
方法。
@available(*, deprecated, message: "See `init(resolver:)`") public func wrap(_ body: (@escaping (Error?) -> Void) throws -> Void) -> Promise<Void> return Promise seal in try body(seal.resolve)
正如我们所见,completion
闭包采用了Optional
Error
参数,所以我怀疑您的旧代码通过错误的闭包是如何工作的。我感觉你的foo
方法声明应该是这样的,
func foo(arg1: Int, arg2: Int, completionHandler: @escaping (Error?) -> Void)
// body
但是对于最新的PromiseKit
,您可以通过传递Optional
Error
来更新completionHandler
,如下所示创建Promises
,
Promise foo(arg1: 1, arg2: 2, completionHandler: $0.resolve)
【讨论】:
谢谢,确实指出了问题!我的completionHandler
是@escaping () -> ()
,在更改为(Error?) -> Void
后它起作用了。不知何故,这确实是用 wrap
构建的,但不是用 init
构建的。以上是关于从 PromiseKit 包装迁移的主要内容,如果未能解决你的问题,请参考以下文章
PromiseKit:委托系统包装器似乎在链的开头未使用时立即返回