Swift: 在闭包中传递来自不同作用域的值

Swift: passing values from different scopes in closures

晚上,我正在从 API 中获取数据,但在将石匠传递到不同范围时遇到了问题:

我的控制器很有趣:

func getDaily() {
    let json = NetworkManager.getDaily()
    print(json)
}

而这个在 NetworkManager 中 Class

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 打印总是空的。

你能告诉我怎么做吗?

对我来说这是正确的方法:

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

您的函数 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)
    }
}