2015-03-31 100 views
1

嗨,我有以下方法:迅速alamofire返回值是空

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的异步请求?我认为该方法在请求完成之前返回播放器对象,或者我错了吗?

在此先感谢!

回答

0

这是一个问题,基本上问你同样的事情。

AlamoFire GET api request not working as expected

所以基本上所发生的事情是,你的POST请求被称为后台队列。所以把它看作是打电话给你的帖子,然后继续下一行。因此,它是在后台线程中,它不会设置变量,直到函数返回。

您可以使用完成处理程序,详见我提供的链接。另一个解决方案是使用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) 
} 
+0

好的,我会明天测试这个。如果具有alamofire请求的函数是在一个单独的类中,这有什么关系? – 2015-03-31 21:34:28

+0

这就是为什么你有'YOUR_NOTIFICATION_NAME',以便NSNotificationCenter知道你在说什么通知。所以你想在同一个类中使用'YOUR_NOTIFICATION_NAME','.addObserver'和'YOUR_FUNCTION'。 '.postNotificationName'可以在其他地方被调用。一旦你发布了你的通知,它就会用你放入选择器的名字来调用这个函数。 – boidkan 2015-03-31 22:01:03

+0

我已经通过上面的链接实施了您的解决方案。谢谢,现在它工作正常! – 2015-04-01 16:17:03

0

所以我在下面的方式建立的:所有的请求

潜行等级:

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类(等级2):

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() 
    . 
    . 
    } 

但玩家对象是空的。你知道为什么吗?我有什么问题吗?