从 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 () -&gt; (),在更改为(Error?) -&gt; Void 后它起作用了。不知何故,这确实是用 wrap 构建的,但不是用 init 构建的。

以上是关于从 PromiseKit 包装迁移的主要内容,如果未能解决你的问题,请参考以下文章

PromiseKit 4 - 包装委托

PromiseKit:委托系统包装器似乎在链的开头未使用时立即返回

PromiseKit 2.0:链接承诺不传递参数

PromiseKit 在 Promises 中包装外部闭包

使用 PromiseKit 从 Objective C 到 Swift 的桥接

从 PromiseKit/Alamofire 返回一个 Promise