swift alamofire 返回值为空
Posted
技术标签:
【中文标题】swift alamofire 返回值为空【英文标题】:swift alamofire return value is empty 【发布时间】:2015-03-31 20:21:21 【问题描述】:您好,我有以下方法:
func getAlamoPlayers() ->[Player]
//Get TeamID
let prefs:NSUserDefaults = NSUserDefaults.standardUserDefaults()
var TeamId:String = prefs.stringForKey("TEAMID")!
//create parameters for POST
let parameters =
["IdTeam": TeamId]
var result: NSArray?
//Request
Alamofire.request(.POST, "XXXXXX.php", parameters: parameters)
.responseJSON (request, response, json, error) -> Void in
result = (json as NSArray)
// Make models from Json data
for (var i = 0; i < result?.count; i++)
let dic: NSDictionary = result![i] as NSDictionary
//Create a team object
var p:Player = Player()
//Assign the values of each key value pair to the team object
p.PlayerID = dic["IdPlayer"] as String
p.PlayerName = dic["name"] as String
p.PlayerFkToTeam = dic["teams_IdTeam"] as String
//Add the team to the player array
self.players.append(p)
return self.players
所以当我在另一个类中调用这个方法时,玩家数组是空的!如何处理 alamofire 的异步请求?我认为该方法在请求完成之前返回播放器对象,还是我错了?
提前致谢!
【问题讨论】:
【参考方案1】:这是一个与您基本相同的问题。
AlamoFire GET api request not working as expected
所以基本上正在发生的事情是您的发布请求正在后台队列中被调用。所以把它想象成打电话给你的帖子,然后继续下一行。因此,由于它在后台线程中,因此在您的函数返回之前它不会设置变量。
您可以使用我提供的链接中详细说明的完成处理程序。另一种解决方案是使用 NSNotificationCenter。设置观察者,然后在您的 POST 请求中发布通知。
例如: 首先在类的顶部声明您的通知名称,您将在其中拥有您的发布响应功能。以便其他类可以访问它
let YOUR_NOTIFICATION_NAME = "NOTIFICATION NAME"
class YOUR_CLASS
然后在类中编写您想要在 POST 完成后执行的代码。
func YOUR_FUNCTION
...
然后在执行 POST 请求之前,您需要添加一个观察者。
NSNotificationCenter.defaultCenter().addObserver(self, selector: "YOUR_FUNCTION", name: YOUR_NOTIFICATION_NAME, object: nil)
然后在您的 POST 请求中发布您的通知。
Alamofire.request(.POST, "XXXXXX.php", parameters: parameters)
.responseJSON (request, response, json, error) -> Void in
...<your code>...
self.players.append(p)
NSNotificationCenter.defaultCenter().postNotificationName(YOUR_NOTIFICATION_NAME, object: self)
【讨论】:
好的,我明天测试一下。带有 alamofire 请求的函数是否在单独的类中是否重要? 这就是为什么你有YOUR_NOTIFICATION_NAME
以便 NSNotificationCenter 知道你在说什么通知。所以你希望YOUR_NOTIFICATION_NAME
、.addObserver
和YOUR_FUNCTION
在同一个类中。 .postNotificationName
可以在其他地方调用。发布通知后,它将使用您在选择器中输入的名称调用该函数。
我已经通过上面的链接实现了您的解决方案。谢谢,现在可以正常使用了!【参考方案2】:
所以我按照以下方式构建它:
具有所有请求的模型类:
let finishedPlayers = "finishedPlayers"
class StrafenkatalogModel: NSObject
.
.
func getAlamoPlayers()-> [Player]
//Get TeamID
let prefs:NSUserDefaults = NSUserDefaults.standardUserDefaults()
var TeamId:String = prefs.stringForKey("TEAMID")!
//create parameters for POST
let parameters =
["IdTeam": TeamId]
var result: NSArray?
//Observer
NSNotificationCenter.defaultCenter().addObserver(self, selector: "returnPlayers", name: finishedPlayers, object: nil)
//Request
Alamofire.request(.POST, "http://smodeonline.com/XXXXXXX.php", parameters: parameters)
.responseJSON (request, response, json, error) -> Void in
result = (json as NSArray)
// Make models from Json data
for (var i = 0; i < result?.count; i++)
let dic: NSDictionary = result![i] as NSDictionary
//Create a team object
var p:Player = Player()
//Assign the values of each key value pair to the team object
p.PlayerID = dic["IdPlayer"] as String
p.PlayerName = dic["name"] as String
p.PlayerFkToTeam = dic["teams_IdTeam"] as String
//Add the team to the teams array
self.players.append(p)
return players
func returnPlayers() ->[Player]
return self.players
那我想在TableViewController类(Class2)中调用它:
class AddPlayersTableViewController: UITableViewController
let model:StrafenkatalogModel = StrafenkatalogModel()
var players:[Player] = [Player]()
override func viewDidLoad()
super.viewDidLoad()
// Get Player objects from the model
NSNotificationCenter.defaultCenter().postNotificationName("finishedPlayers", object: self)
self.players = self.model.returnPlayers()
.
.
但是玩家对象是空的。你知道为什么吗?我有什么问题吗?
【讨论】:
以上是关于swift alamofire 返回值为空的主要内容,如果未能解决你的问题,请参考以下文章