如何使用swift-4 Promises then,done,catch和其他块

时间:2018-04-29 21:11:20

标签: ios swift swift4 promisekit

我想了解swift-4中的承诺。如何使用多个then语句并完成,捕获块。

在这里,我试图从承诺中获取价值。但是我收到了错误。有人可以帮我理解承诺吗?

这是我的代码。

import UIKit
import PromiseKit

struct User {
    var firstname : String?
    var lastname  : String?
}

struct APIError {
    var message : String?
}

class ViewController : UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        let userPromise : Promise = self.getUserDetails()
        userPromise.then { user -> Void in
            //print(user.f)
        }
    }

    func getUserDetails()->Promise<User> {
        return Promise<User> { resolve in
            let user  = User(firstname: "Scot", lastname: "dem")
            if ((user.firstname?.count) != nil) {
                resolve.fulfill(user)
            } else {
                let error = APIError(message: "User not valid")
                resolve.reject(error as! Error)
            }
        }
    }
}

获得用户详细信息后,我想创建一个全名,大写的promises依赖于userPromise。

我想使用多个then,done,finally块。只是想了解用法。

  

为什么我在使用userPromise.then {user - &gt;无效

我应该在街区内给出什么

1 个答案:

答案 0 :(得分:11)

在PromiseKit 6中,then无法再返回Void。这主要是由于Swift 4中的tuplegate问题。

来自PromieKit 6 Release News

  

使用PromiseKit我们的then做了很多事情,我们依靠Swift   从上下文推断出正确的then。但是多线   then它不会这样做,而不是告诉你那个   情况模棱两可,它会发明一些其他错误。通常是   可怕的cannot convert T to AnyPromise。我们有一个故障排除   打击这个的指南,但我相信工具,只有工作,什么时候   你花了4年时间等待Swift解决这个问题而Swift没有   解决问题,你做什么?我们选择在这里寻找解决方案   更高的水平。

     

因此,我们将then分为thendonemap

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

因此.then { (user) -> Void in不再有效,这就是您收到错误的原因。
它现在设计为像这样返回Thenable

userPromise.then { user -> Promise<User> in
    //return yet another promise
}

以前返回.then的{​​{1}}现在是{@ 1}}。
即:

Void

所以当你混合起来时:

我们得到:

.done