PromiseKit 3.0和Swift 2

时间:2015-12-09 14:41:06

标签: swift promisekit

我应该如何在PromiseKit 3.0和Swift 2中链接承诺?我正在尝试以下代码:

let url = "https://httpbin/org/get";
let url2 = "https://httpbin/org/get";
firstly {
    NSURLSession.GET(url)
}.then { (json: NSDictionary) in
    NSURLSession.GET(url2) // Error in this line
}.then { (json: NSDictionary) in
    print("End of second request");
}

但我在第6行收到错误“无法将类型'URLDataPromise'的值转换为闭包结果类型'AnyPromise'。”

这基本上是从PromiseKit网站检索的样本,它应该可以工作,不是吗?我做错了什么?

2 个答案:

答案 0 :(得分:8)

我明白了。问题只是NSURLSession.GET没有返回NSDictionary,因此以下代码足以解决问题:

let url = "https://httpbin/org/get";
let url = "https://httpbin/org/get";
let url2 = "https://httpbin/org/get";
firstly {
    NSURLSession.GET(url)
}.then { data in
    NSURLSession.GET(url2)
}.then { data in
    print("End of second request");
}

一个重要的事情是,如果你的闭包有多行代码,Swift就不能推断出类型,如果是这种情况你必须在闭包声明中指定类型。 这里有一些例子:

let url = "https://httpbin/org/get";
let url2 = "https://httpbin/org/get";
firstly {
    NSURLSession.GET(url)
}.then { data -> URLDataPromise in
    print("Two lines clojure with return");
    return NSURLSession.GET(url2)
}.then { data -> Void in
    print("Two lines clojure without return");
    print("Second line sample");
}

答案 1 :(得分:1)

首先,我没有看到可以从NSURLSession.GET返回字典的界面,所以我正在使用NSData。此外,您必须返回每个then闭包的承诺,以便将它们链接在一起:

firstly {
    NSURLSession.GET(url)
}.then { (data) -> AnyPromise in
    return AnyPromise(bound: NSURLSession.GET(url2))
}.then { (secondData) in
    print("End of second request")
}