【发布时间】:2015-01-29 04:46:52
【问题描述】:
我无法获得 Alamofire 请求的结果。因此,我创建了从 json 异步调用获得的数组的输出。我无法从调度 {...} 中获取 resultArray。当我添加 println调试代码。第二个出现在第一个之前。 我只想使用 resultArray 从 Alamofire 获取数据以显示在 UIPickerView 中。请帮助!!!
这是我的代码
import UIKit
import Alamofire
class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource{
@IBOutlet var venuePicker : UIPickerView?
var resultOld = [String:String]() // i need it to get only value from json
var result : [String]?
let refreshControl = UIRefreshControl()
override func viewDidLoad() {
if result == nil {
populateVenues ({ (error, result) -> Void in
self.result = result as? [String]
self.venuePicker?.reloadAllComponents()
})
}
}
func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
return 1
}
func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
if result != nil{
return result!.count// Why i can't use result?.count instead of result!.count
}
else{
return 0
}
}
func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String! {
if result != nil{
println(result)
return result?[row]
}
else{
return "..."
}
}
func populateVenues(completion : (error: NSError?,result : AnyObject?) -> Void){
Alamofire.request(.POST, "http://xxxx.xxxx.xxx").responseJSON() {
(_, _, jsonData, error) in
if error == nil{
var venues = JSON(jsonData!)
for (k, v) in venues {
self.resultOld[k] = v.arrayValue[0].stringValue
}
self.result = self.resultOld.values.array
completion(error: nil,result: self.result)
}
else{
println("Error!!")
completion(error: error!,result: nil)
}
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
这是我在控制台的输出
The 2st result array : []
The 1st result array : [ORIX Kobe Nyusatsu, NPS Sendai Nyusatsu, JU Gunma, KAA Kyoto, JU Ibaraki, USS Gunma, ISUZU Kobe, NAA Osaka Nyusatsu, SMAP Sapporo Nyusatsu, L-Up PKobeNyusatsu, ARAI Sendai, TAA Minami Kyushu, NPS Oyama Nyusatsu, CAA Tokyo, JU Toyama, USS Shikoku, NPS Gifu Nyusatsu, NAA Fukuoka, KCAA Yamaguchi, JU Fukuoka, LAA Kansai, JAA, TAA Kinki, USS Sapporo, JU Miyagi, USS Fukuoka, JU Tokyo]
我真的需要知道发生在我身上的事情以及为什么我不能先得到异步调用的结果。
【问题讨论】:
-
异步调用需要时间。在您的 populateVenue 函数中设置一个完成块,并将第二个结果数组放入完成块中。这样它只会在完整的 populateVenue 完成后打印
-
你能建议我如何首先获取数据吗?请提供任何代码建议。谢谢你
-
好的,我用完成块的基本代码发布了一个答案。
-
@Rob>重新加载数据,没有成功。 @ad121,谢谢。如果你不介意,你能给我一个解决方案吗?
-
现在我在 viewDidLoad 中得到了第二个数组,但它只能在 populateVenues{} 中工作。我仍然无法得到 resultArray,任何帮助?我已经更新了代码