晚上,我从API中获取数据,而且我在将泥瓦匠传递到不同的范围时遇到了问题:
我在控制器中玩得很开心:
func getDaily() {
let json = NetworkManager.getDaily()
print(json)
}
这是NetworkManager类中的一个
class func getDaily() -> JSON {
//Setting the url for the request
let url = "\(base_url)planetary/apod?api_key=\(apy_key)"
var json: JSON = []
//Making the request
Alamofire.request(url, method: .get).validate().responseJSON{ response in
switch response.result {
case .success(let value):
json = JSON(value)
//print("JSON: \(json)")
case .failure(let error):
print(error)
}
}
return json
}
显然第一个函数中的json打印总是空的。
你能告诉我这样做的方法吗?
答案 0 :(得分:1)
你的函数getDaily()不应该返回JSON。因为这是异步请求,所以您需要回调。试试这样:
class func getDaily(result: @escaping (JSON) -> ()) {
//Setting the url for the request
let url = "\(base_url)planetary/apod?api_key=\(apy_key)"
var json: JSON = []
//Making the request
Alamofire.request(url, method: .get).validate().responseJSON{ response in
switch response.result {
case .success(let value):
json = JSON(value)
result(json)
case .failure(let error):
print(error)
}
}
}
您的来电者将成为:
func getDaily() {
NetworkManager.getDaily { json in
print(json)
}
}
答案 1 :(得分:0)
对我而言,这是正确的方法:
import UIKit
import Alamofire
class APIManager: NSObject {
static let sharedInstance = APIManager()
//TODO :-
/* Handle Time out request alamofire */
func requestGETURL(_ strURL: String, success:@escaping (JSON) -> Void, failure:@escaping (Error) -> Void)
{
Alamofire.request(strURL).responseJSON { (responseObject) -> Void in
//print(responseObject)
if responseObject.result.isSuccess {
let resJson = JSON(responseObject.result.value!)
//let title = resJson["title"].string
//print(title!)
success(resJson)
}
if responseObject.result.isFailure {
let error : Error = responseObject.result.error!
failure(error)
}
}
}
func requestPOSTURL(_ strURL : String, params : [String : AnyObject]?, headers : [String : String]?, success:@escaping (JSON) -> Void, failure:@escaping (Error) -> Void){
Alamofire.request(strURL, method: .post, parameters: params, encoding: JSONEncoding.default, headers: headers).responseJSON { (responseObject) -> Void in
if responseObject.result.isSuccess {
let resJson = JSON(responseObject.result.value!)
success(resJson)
}
if responseObject.result.isFailure {
let error : Error = responseObject.result.error!
failure(error)
}
}
}
}
/********************************* To get response in another class ********************************/
APIManager.sharedInstance.requestPOSTURL(HttpsUrl.Address, params: dict as [String : AnyObject]?, headers: nil, success: { (json) in
// success code
print(json)
}, failure: { (error) in
//error code
print(error)
})