我正在使用我的本地json api,它使用swiftyjson和alamofire接收和解析数据时效果很好,但是当它返回这些数据时,我遇到了一些麻烦:
import Alamofire
import SwiftyJSON
...
func getApi() -> Array<JSON> {
let user = "user"
let password = "password"
Alamofire.request(.GET, "http://localhost/api/")
.authenticate(user: user, password: password)
.responseString { (req, res, body, error) in
if let data = (body)!.dataUsingEncoding(NSUTF8StringEncoding) {
let json = JSON(data: data)
println(json) // works fine
return json // does not work
}
}
}
所以它打印&#34; JSON不能转换为Void&#34; ...
有人知道如何处理这件事吗?
你认为我正在使用alamofire进行&#34; http-basic-authentification&#34; ?
问候和感谢!
答案 0 :(得分:4)
如果你的api返回一个JSON对象,alamofire会提供一个.responseJSON,而swiftyJSON可以包含该响应。
另外请不要忘记此请求是异步的,因此您可能需要在完成处理程序中获取这些结果,如下所示:
func getApi(completionHandler: (jsonResponse: JSON) -> () {
let user = "user"
let password = "password"
Alamofire.request(.GET, "http://localhost/api/")
.authenticate(user: user, password: password)
.responseJSON { (req, res, JSON, error) in
println(json) // works fine
completionHandler(json)
}
}
}
像这样调用方法:
getAPI(completionHandler: { (response: JSON) -> () in
// do something with your response. If the JSON contains an array you can iterate through it here.
}
接下来的好处是检查Alamofire doc上的“响应序列化”部分。
答案 1 :(得分:1)
您正在尝试在没有返回类型(Void)的块中返回JSON类型的对象。
答案 2 :(得分:1)
根据你的变量名,你应该设置
res = json
或
res.setResponse(json)
或者像这样。现在无法检查,因为我现在远离我的Mac
答案 3 :(得分:1)
您的函数返回一个JSON数组:[JSON]
。
您正在尝试返回单个JSON
类型对象。
更改return语句以返回数组:
return [json] // should work
@ Gwendle的答案是对的。您需要重构您的方法以获取完成块并将响应处理放在该完成块中。