Swift:在闭包中传递来自不同范围的值

时间:2017-03-23 11:50:42

标签: ios swift networking afnetworking swifty-json

晚上,我从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打印总是空的。

你能告诉我这样做的方法吗?

2 个答案:

答案 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)
 })