我有一个使用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
}
它有效,但是我只能访问这两个中的第一个值,如何访问它们?
答案 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)")
}
}