当前位置: 首页 > 面试题库 >

为什么我无法从Alamofire获得请求结果

符国安
2023-03-14
问题内容

我无法获取Alamofire请求的结果。因此,我创建了从json异步调用获取的数组的输出。我无法从dispatch
{…}中获取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()函数未在之前完成println("The 2st 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 completed
var 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)
        }
    }
}


 类似资料:
  • 我收到的错误: 这是我的代码 我尝试了几种不同的方法来读取此文件,但我无法弄清楚为什么会发生这种情况。我使用的扩展名.rtf,.txt,认为这可能是文件本身的问题。该文件仅包含以下内容:

  • 问题内容: 假设有一个日期框架,其中的一列包含日期作为字符串。为此,我们创建以下dataFrame作为示例: 在上面的代码中,将生成一个随机日期列,下面是一个示例: 我正在尝试使用以下代码(来自pySpark文档)更改日期格式: 但是我得到这个不好的结果: 我想有一个与字符串dataType有关的问题,但与此同时,我不明白为什么下面的代码行得通,而上面的代码却行不通。 输出: 这是我想要的最后结果

  • http://maps.googleapis.com/maps/api/directions/json?origin=Central香港 在没有mode=transit参数的情况下,请求可以正常工作,但结果只包括驾驶方向。添加最后一个参数后,我得到: "状况":"INVALID_REQUEST" 我能做些什么来使这个工作?有明确的交通选项,它们列在谷歌地图上。

  • 问题内容: 我在wp主题中设置了基本的wordpress ajax示例。触发是由modernizr.js检查页面上的媒体查询来完成的。 我已经本地化了脚本并使其入队。 最后处理请求的函数是: 这总是使我的响应为0(无属性),我也不知道为什么。PS这都是本地的。 问题答案: 一切都必须在这里匹配: PHP JS

  • 我的代码基于SpringBoot,接收post请求,解析json数据并使用jdbc执行。 } curl命令如下所示: 但是,当我通过curl发送post请求时,无法解析参数并且始终为空。 为什么会发生这个问题,如何解决? 堆栈跟踪:

  • 我在Alamofire 5.3中收到了大量失败的请求,其中响应对象本身为nil,或者错误为“无法解析响应”。我可以从服务器日志中看到,所有这些请求都返回有效。 这是我的设置: API管理器类: AccessTokenInterceptor: 这个拦截器从插入我的授权令牌 我也使用标准路由器的URL刚需转换,编码是通过JSON序列化(字典)或可编码协议(对象) 奇怪的是,我不认为我在做任何不同于我使