我正在使用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)
}
}
}
提前感谢任何建议!
答案 0 :(得分:2)
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
}
}
}