Swift2 嵌套Alamofire回调或全局使用的返回值

Swift2 嵌套Alamofire回调或全局使用的返回值,swift2,ios9,alamofire,swifty-json,Swift2,Ios9,Alamofire,Swifty Json,我目前正在尝试嵌套Alamofire请求,以使用我已经使用GET请求成功接收到的数据 对于这段代码,我在这个问题中使用了Rob的答案 但是,我既不能嵌套Alamofire请求,也不能单独使用它们 这就是我想做的 override func viewDidLoad() { super.viewDidLoad() var currentFoodType: String = "" var currentFoodList: String = "" //debug

我目前正在尝试嵌套Alamofire请求,以使用我已经使用GET请求成功接收到的数据

对于这段代码,我在这个问题中使用了Rob的答案

但是,我既不能嵌套Alamofire请求,也不能单独使用它们

这就是我想做的

override func viewDidLoad() {
    super.viewDidLoad()


    var currentFoodType: String = ""
    var currentFoodList: String = ""

    //debug

    //this is how I get back the token from NSUserDefault
    if let myToken = userDefaults.valueForKey("token"){


        // calling method to get the user info
        getUserInfo(myToken as! String)

        // calling method to get the product type
        func getFoodCategory(completionHandler: (NSDictionary?, NSError?) -> ()) {
            getProductTypes(myToken as! String, completionHandler: completionHandler)
        }
        getFoodCategory() { responseObject, error in
            // use responseObject and error here

            let foodTypesJSON = JSON(responseObject!)
            //to get one single food category
            currentFoodType = (foodTypesJSON["types"][0].stringValue)
            print(currentFoodType)


            /////////////////////////////////////////
            func getFoodsByCategory(completionHandler: (NSDictionary?, NSError?) -> ()) {
                print("getting " + currentFoodType)
                self.getProductsByType(myToken as! String, productType: currentFoodType, completionHandler: completionHandler)
            }

            getFoodsByCategory() { responseObject, error in
                // use responseObject and error here
                print("responseObject = \(responseObject); error = \(error)")

                return
            }

           return
        }

    }
然后,我从中调用的另外两个函数是非常直接的Alamofire请求,并回调到上面的CompletionHandler

    //GET THE PRODUCT TYPES FROM THE SERVER
func getProductTypes(myToken: String, completionHandler: (NSDictionary?, NSError?) -> ())  {

    let requestToken = "Bearer " + myToken
    let headers = ["Authorization": requestToken]
    let getProductTypesEndpoint: String = BASE_URL + PRODUCT_TYPES


    Alamofire.request(.GET, getProductTypesEndpoint, headers: headers)
        .responseJSON{ response in
            switch response.result {
            case .Success(let value):
                completionHandler(value as? NSDictionary, nil)
            case .Failure(let error):
                completionHandler(nil, error)
            }
    }//END ALAMOFIRE GET responseJSON


}
上面的函数返回一个类似于“甜点”的食物,它将在下面的函数中用于从服务器获取所有甜点

//GET THE PRODUCTS FROM THE SERVER GIVEN A CATEGORY
func getProductsByType(myToken: String, productType: String, completionHandler: (NSDictionary?, NSError?) -> ()){

    let requestToken = "Bearer " + myToken
    let headers = ["Authorization": requestToken]
    let getProductTypesEndpoint: String = BASE_URL + PRODUCT_BY_TYPE + productType

    Alamofire.request(.GET, getProductTypesEndpoint, headers: headers)
        .responseJSON { response in
            switch response.result {
            case .Success(let value):
                print("no errors")
                let auth = JSON(value)
                print("The pbt GET description is: " + auth.description)
                completionHandler(value as? NSDictionary, nil)
            case .Failure(let error):
                print("there was an error")

                completionHandler(nil, error)
            }
    }//END ALAMOFIRE GET responseJSON
}
这很好,因为当我在getProductsByType函数中打印时

使用

我得到了所有产品的JSON,但问题在于viewDidload函数中嵌套了回调

getFoodsByCategory() { responseObject, error in
                // use responseObject and error here
                print("responseObject = \(responseObject); error = \(error)")                   
                return
            }
该位中的打印显示出某些错误,因此我无法按照自己的意愿解析我的响应

因为我得到了以下信息

responseObject = nil; error = nil

因此,我的猜测是,必须有一种不同的方法来嵌套这些回调?

看看来自的链接承诺。这也适用于Alamofire:

func loadFoo() -> Promise<Bar> {
    return Promise<Bar> { fulfill, reject in 
        Alamofire.request(.GET, "url")
        .responseJSON { response in
            switch response.result {
                case .Success(let value):
                     let bar = Bar(fromJSON: value)
                     fulfill(bar)
                case .Failure(let error):
                     reject(error)
            }
        }
    }
}


// Usage    
getBar()
.then { bar -> Void in
    // do something with bar
}
.error { error in
    // show error
}
func loadFoo()->Promise{
返回承诺{履行,拒绝
请求(.GET,“url”)
.responseJSON{中的响应
开关响应。结果{
成功案例(let value):
let bar=bar(fromJSON:value)
完成(巴)
案例。失败(let错误):
拒绝(错误)
}
}
}
}
//用法
getBar()
.然后{bar->Void in
//用酒吧做点什么
}
.error{中的错误
//显示错误
}
这是一个非常简单的示例,但您可以在文档中找到更多相关示例

func loadFoo() -> Promise<Bar> {
    return Promise<Bar> { fulfill, reject in 
        Alamofire.request(.GET, "url")
        .responseJSON { response in
            switch response.result {
                case .Success(let value):
                     let bar = Bar(fromJSON: value)
                     fulfill(bar)
                case .Failure(let error):
                     reject(error)
            }
        }
    }
}


// Usage    
getBar()
.then { bar -> Void in
    // do something with bar
}
.error { error in
    // show error
}