繁体   English   中英

在执行功能之前如何在Swift中等待变量?

[英]How to wait for variable in Swift before executing function?

我正在使用Alamofire连接API,返回一个JSON对象,将其分配给变量,然后尝试显示它。 问题在于该变量即将变为空,因为它在从服务器取回值之前试图显示。

这是我的Networking.swift文件:

class Networking {

class func postPurchase() {

    let parameters = [
        "login_user": "admin@poqeta.com",
        "login_password": "p0q3t4",
        "item_id": 5,
        "machine_token": "/HyZyq2FgU4RONnDlzPXWA==",
        "amount": 1
    ]

    Alamofire.request(.POST, "http://poqeta.herokuapp.com/api/v1/purchases/add_item", parameters: parameters, encoding: .JSON)
        .responseData { response in
            print(response.request)
            print(response.response)
            print(response.result)
    }
}

class func confirmPurchase() -> String {
    var token:String = " "

    Alamofire.request(.POST, "http://poqeta.herokuapp.com/api/v1/purchases/purchase", parameters: ["login_user": "admin@poqeta.com", "login_password": "p0q3t4"])
        .responseJSON { response in
            switch response.result {
            case .Success(let data):
                let json = JSON(data)
                let dispenseToken:String = json["token"].stringValue
                print(dispenseToken)
                token = dispenseToken
            case .Failure(let error):
                print("Request failed with error: \(error)")
                return
            }
    }
    return token
}

这是试图获取变量并显示它的函数(使用PopUpViewControllerSwift):

    @IBAction func showPopUp(sender: AnyObject) {

    var purchase_token:String = " "

    Networking.postPurchase()
    purchase_token = Networking.confirmPurchase()

    let bundle = NSBundle(forClass: PopUpViewControllerSwift.self)
    if (UIDevice.currentDevice().userInterfaceIdiom == .Pad)
    {
        self.popViewController = PopUpViewControllerSwift(nibName: "PopUpViewController_iPad", bundle: bundle)
        self.popViewController.title = "Purchase Complete"
        self.popViewController.showInView(self.view, withImage: nil, withMessage: "Your purchase token is " + purchase_token, animated: true)
    } else
    {
        if UIScreen.mainScreen().bounds.size.width > 320 {
            if UIScreen.mainScreen().scale == 3 {
                self.popViewController = PopUpViewControllerSwift(nibName: "PopUpViewController_iPhone6Plus", bundle: bundle)
                self.popViewController.title = "Purchase Complete"
                self.popViewController.showInView(self.view, withImage: nil, withMessage: "Your purchase token is " + purchase_token, animated: true)
            } else {
                self.popViewController = PopUpViewControllerSwift(nibName: "PopUpViewController_iPhone6", bundle: bundle)
                self.popViewController.title = "Purchase Complete"
                self.popViewController.showInView(self.view, withImage: nil, withMessage: "Your purchase token is " + purchase_token, animated: true)
            }
        } else {
            self.popViewController = PopUpViewControllerSwift(nibName: "PopUpViewController", bundle: bundle)
            self.popViewController.title = "Purchase Complete"
            self.popViewController.showInView(self.view, withImage: nil, withMessage: "Your purchase token is " + purchase_token, animated: true)
        }
    }
}

在此先感谢您的任何建议!

postPurchase和confirmPurchase是acsync函数,请勿使用return。 尝试:

    class func postPurchase(handleComplete:((isOK:Bool)->())) {

    let parameters = [
        "login_user": "admin@poqeta.com",
        "login_password": "p0q3t4",
        "item_id": 5,
        "machine_token": "/HyZyq2FgU4RONnDlzPXWA==",
        "amount": 1
    ]



     Alamofire.request(.POST, "http://poqeta.herokuapp.com/api/v1/purchases/add_item", parameters: parameters, encoding: .JSON)
            .responseData { response in
                print(response.request)
                print(response.response)
                print(response.result)
                // check request success or failse
//                if  success
                handleComplete(isOK: true)
//                else
//                handleComplete(isOK: false)
        }
    }

class func confirmPurchase(handleComplete:((token:String?)->())){
    var token:String = " "

    Alamofire.request(.POST, "http://poqeta.herokuapp.com/api/v1/purchases/purchase", parameters: ["login_user": "admin@poqeta.com", "login_password": "p0q3t4"])
        .responseJSON { response in
            switch response.result {
            case .Success(let data):
                let json = JSON(data)
                let dispenseToken:String = json["token"].stringValue
                print(dispenseToken)
                token = dispenseToken
                handleComplete(token: token)
            case .Failure(let error):
                print("Request failed with error: \(error)")
                handleComplete(token: nil)
            }
    }
}

并使用它:

 @IBAction func showPopUp(sender: AnyObject) {

    var purchase_token:String = " "

    Networking.postPurchase { (isOK) in
        if isOK{
            Networking.confirmPurchase({ (token) in
                if let tok = token{
                    purchase_token = tok

                    let bundle = NSBundle(forClass: PopUpViewControllerSwift.self)
                    if (UIDevice.currentDevice().userInterfaceIdiom == .Pad)
                    {
                        self.popViewController = PopUpViewControllerSwift(nibName: "PopUpViewController_iPad", bundle: bundle)
                        self.popViewController.title = "Purchase Complete"
                        self.popViewController.showInView(self.view, withImage: nil, withMessage: "Your purchase token is " + purchase_token, animated: true)
                    } else
                    {
                        if UIScreen.mainScreen().bounds.size.width > 320 {
                            if UIScreen.mainScreen().scale == 3 {
                                self.popViewController = PopUpViewControllerSwift(nibName: "PopUpViewController_iPhone6Plus", bundle: bundle)
                                self.popViewController.title = "Purchase Complete"
                                self.popViewController.showInView(self.view, withImage: nil, withMessage: "Your purchase token is " + purchase_token, animated: true)
                            } else {
                                self.popViewController = PopUpViewControllerSwift(nibName: "PopUpViewController_iPhone6", bundle: bundle)
                                self.popViewController.title = "Purchase Complete"
                                self.popViewController.showInView(self.view, withImage: nil, withMessage: "Your purchase token is " + purchase_token, animated: true)
                            }
                        } else {
                            self.popViewController = PopUpViewControllerSwift(nibName: "PopUpViewController", bundle: bundle)
                            self.popViewController.title = "Purchase Complete"
                            self.popViewController.showInView(self.view, withImage: nil, withMessage: "Your purchase token is " + purchase_token, animated: true)
                        }
                    }

                }else{
                    // false --> do st
                }
            })
        } else{
            // do st
        }
    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM