Alamofire下载数据后的返回值

时间:2015-12-22 18:45:28

标签: ios swift alamofire

我有一个使用Alamofire下载数据的功能,然后我想返回该数据。现在我知道Alamofire是异步运行的,为了返回数据,我应该使用completionHandler,但是我不知道如何使用它。由于我不是第一个遇到这种问题的人,我找到了解决类似问题的方法,但我不确定将它们应用到我的案例中。这是我的代码:

func downloadImageFromServer(imageUrl: String) -> (String, String) {
    var myData1 = String()
    var myData2 = String()
    Alamofire.request(.GET, imageUrl)
        .responseImage { response in
            switch response.result {
            case .Success:
                if let newImage = response.result.value {
                myData1 = //returned image name
                myData2 = //edited image name
                }
            case .Failure:
                //Do something
            }
    }
    return (myData1, myData2)
}

我应该这样做:

func downloadImageFromServer(imageUrl: String, completionHandler: (String?, String?) -> ()) {
    var myData1 = String()
    var myData2 = String()

    Alamofire.request(.GET, imageUrl)
        .responseImage { response in
            switch response.result {
                //if user does have a photo
            case .Success:
                myData1 = //Something
                myData2 = //Something else
                completionHandler(myData1 as? String, myData2 as? String)
            case .Failure:
                //Print error
            }
    }
}

更新 是的,我的问题与其他问题非常相似,但在我的情况下,代码必须返回2个值,这就是我遇到困难的地方。 这是我的gettin值代码:

 func getImages(orders: String, completionHandler: (String?, String?) -> ()) {
    justDoIt(orders, completionHandler: completionHandler)
}

然后

getImages(imgURL) { responseObject, error in
    print(responseObject)
    return
}

它有效,但是我只能访问这两个中的第一个值,如何访问它们?

1 个答案:

答案 0 :(得分:2)

你的方法是正确的。您可以在闭包中使用另一个变量来查看请求是否被正确调用(或函数中的另一个变量,例如errorHandler)。用法示例:

downloadImageFromServer(imgURL) { (data1, data2) in
    print("Data1: \(data1). Data2: \(data2)")
}

向您的函数添加成功/失败变量的基本示例:

func downloadImageFromServer(imageUrl: String, completionHandler: (Bool, String?, String?) -> ()) {
    var myData1 = String()
    var myData2 = String()

    Alamofire.request(.GET, imageUrl)
        .responseImage { response in
            switch response.result {
                //if user does have a photo
            case .Success:
                myData1 = //Something
                myData2 = //Something else
                completionHandler(true, myData1 as? String, myData2 as? String)
            case .Failure:
                completionHandler(false, nil, nil)
                //Print error
            }
    }
}

使用改进版downloadImageFromServer()

downloadImageFromServer(imgURL) { (succes, data1, data2) in
    if success {
        print("Success. Data1: \(data1). Data2: \(data2)")
    } else {
        print("Error. Data1: \(data1). Data2: \(data2)")
    }
}