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.addObserverYOUR_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 返回值为空的主要内容,如果未能解决你的问题,请参考以下文章

将 Json 从 Php 返回到 Swift Alamofire

Swift基础语法学习总结二

HttpResponse返回的值为空

如何从 Alamofire 返回值

为啥在 MVC 项目中返回的表单值为空?

Paypal Success 交易返回值为空 - 有时