gpt4 book ai didi

ios - 如何在执行函数之前等待 Swift 中的变量?

转载 作者:行者123 更新时间:2023-11-28 12:51:11 39 4
gpt4 key购买 nike

我正在使用 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 is acsync function, don't use return. Try:

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

}

关于ios - 如何在执行函数之前等待 Swift 中的变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36490882/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com