Dam*_*dar 2 ios swift promisekit swift4
我想了解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)
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
一旦我得到用户详细信息,我想创建一个全名,大写承诺依赖于userPromise.
我想使用多个then,done,finally块.只是想了解用法.
为什么我在使用userPromise.then {user - > Void in
我应该在街区内给出什么
sta*_*Man 13
在PromiseKit 6中,then无法再返回Void.这主要是由于Swift 4中的tuplegate问题.
引用来自PromieKit 6发布新闻
使用PromiseKit我们
then做了很多事情,我们依靠Swiftthen从上下文中推断出正确的.然而,对于多行then,它将无法做到这一点,而不是告诉你情况不明确,它会发明一些其他错误.经常是可怕的cannot convert T to AnyPromise.我们有一个故障排除指南来解决这个问题,但我相信工具才能正常工作,当你花费4年时间等待Swift解决问题并且Swift无法解决问题时,你会怎么做?我们选择在更高层次上找到解决方案.所以我们分成
then了then,done和map.
then被提供先前的承诺价值并要求您返回承诺.done被提供前一个承诺值并返回一个Void承诺(这是链使用的80%)map是先前的承诺价值,并要求你返回一个非承诺,即.一个值.
因此.then { (user) -> Void in不再有效,这就是您收到错误的原因.
它现在设计为返回Thenable如此:
userPromise.then { user -> Promise<User> in
//return yet another promise
}
Run Code Online (Sandbox Code Playgroud)
在.then以前返回Void,现在它自己.done.
即:
userPromise.done { (user) in
print(user)
}
Run Code Online (Sandbox Code Playgroud)
我们得到:
userPromise
.then { (user) -> Promise<User> in
//return another Promise
return self.uppercasePromise(on: user)
}
.done { (user) in
/*
Depending on your sequence, no more promises are left
and you should have a matured user object by now
*/
print(user)
}
.catch { (error) in
print(error)
}
.finally {
print("finally")
}
func uppercasePromise(on user: User) -> Promise<User> {
/*
Didn't understand your statement but do whatever you meant when you said:
"Once I get the user details I want to make a full name, "
uppercase promises which are dependent on userPromise."
*/
return Promise { seal in
seal.fulfill(user)
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3538 次 |
| 最近记录: |