Xcode中奇怪的promiseKit 6语法行为

时间:2018-05-06 16:37:50

标签: ios swift promisekit

我开始使用PromiseKit来阻止自己编写具有10级回调的函数。

我使用CocoaPods安装了最新版本(6.2.4),正在运行最新版本的xCode,在我试图让它工作的文件中导入PromiseKit,但是我得到了非常奇怪的Xcode行为,导致了几个错误。

我打算做一些非常基本的事情来开始:

下面的功能为我正在处理的产品概述应用中的产品类别创建了过滤器(ProductListComponents)。

func createCategoryComponents(masterComponent: MasterComponent?) -> Promise<[ProductListComponents]> {
    return Promise { seal in
        //create a bunch of product category components
        seal.resolve([components])
    }
}

这里一切都很好。然后我试着弄明白:

firstly {
    self.createCategoryComponents(masterComponent: masterComponent)
}.then { createdComponents in
    completion.resolve(nil, createdComponents)
}

这拒绝工作。首先,当我尝试输入firstly代码时,Xcode建议:

firstly(execute: { () -> Guarantee<T> in
    //code
})

firstly(execute: { () -> Thenable in
    //code
})

我在任何PromiseKit文档中都没有看到这种语法。它还建议例如奇怪的语法。 .then电话。当接受Xcode的建议时,它显然会显示错误,因为这不是正确的PromiseKit语法。当忽略Xcode的建议时,我明白了:

enter image description here

显然这里出了点问题,我最好的猜测是PromiseKit的安装出了问题。我已经清理了我的项目,重新安装了pod,重新启动了Xcode,但似乎没有任何工作。

问题

有人知道我在这里遇到了什么样的问题,更重要的是,我如何解决这个问题?

任何帮助都会非常感激。

1 个答案:

答案 0 :(得分:1)

根据release notes

  
      
  • then已提供先前的承诺值,并要求您返回承诺。
  •   
  • done被提供前一个承诺值并返回一个Void承诺(占链使用量的80%)
  •   
  • map被提供前一个承诺值并要求您返回一个非承诺,即。价值。
  •   

所以,then不应该在这里工作,因为你需要返回promise值。如果您只是将then更改为done,则可以使用。

还有一些建议。

  • firstly真的是关于视觉装饰(我相信它在PMK文档的某个地方,但我现在无法找到它),所以,如果这让你感到困惑,请尝试删除它;
  • PMK的主要特征是chain。你绝对应该按照这个原则编写代码;
  • 另外,不要忘记错误。在链的末尾使用catch

您的代码的最后一个例子:

firstly {
    self.createCategoryComponents(masterComponent: masterComponent)
}
.done { createdComponents in
    completion.resolve(nil, createdComponents)
}
.catch { error in
    // don't forget about errors
}