2015-03-31 103 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() 
    . 
    . 
    } 

但玩家對象是空的。你知道爲什麼嗎?我有什麼問題嗎?