因此,异步调用是在另一个线程上执行的。因此,当您调用该函数时
populateVenue(),该
populateVenue()函数未在之前完成
println("The2st result array : (self.resultArray)")。如果您设置populateVenue()要关闭,则不会发生这种情况。例:
override func viewDidLoad() { super.viewDidLoad() populateVenue( { (error, result) -> Void in println("The 2st result array : (self.resultArray)" ) })}func populateVenue(completion: (error: NSError?, result: AnyObject?) -> Void) { Alamofire.request(.POST, "http://localhost:8080/ws/automobile/global/auction/latest/venues").responseJSON() { (_, _, jsonData, error) in if error == nil { // do whatever you need // Note that result is whatever data you retrieved completion(nil, result) } else {println("Errror")completion(error!, nil) } }}编辑:
我仍在尝试了解您的问题,但这是我的最佳选择。请注意,我不知道resultOld的用途是什么,因此我将其删除。如果绝对需要,可以将其重新添加。我的设计是使属性成为可选属性,并将结果返回到完成块中。然后,在viewDidLoad中,您可以初始化属性数组并重新加载屏幕。
@IBOutlet var venuePicker : UIPickerView?// Try making this optional so you can tell when the network call is completedvar result: [String]?var error = "Error"let refreshControl = UIRefreshControl()override func viewDidLoad() { if result == nil { populateVenues ( { (result) -> Void in self.result = result self.venuePicker?.reloadAllComponents() }) }}func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int { return 1}func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { if result != nil { return result.count } else { return 0 }}func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String! { return result[row]}func populateVenues(completion : (result : [String]?) -> Void){ Alamofire.request(.POST, "http://localhost:8080/ws/automobile/global/auction/latest/venues").responseJSON() { (_, _, jsonData, error) in if error == nil{ var venues = JSON(jsonData!) for (k, v) in venues { resultOld[k] = v.arrayValue[0].stringValue } result = resultOld.values.array completion(result: result) } else{ println("Error!!") completion(result: nil) } }}


