- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我无法获得 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.结果数组)”)
。如果您将 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 的用途是什么,所以我删除了它。如果你绝对需要它,你可以把它加回去。我在这里的设计是使属性可选,并在完成 block 中返回结果。然后在 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)
}
}
}
关于json - 为什么我无法从 Alamofire 获取请求结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28207185/
我需要做一个 POST请求带有 JSON 的 HTTP 正文对象,但我还需要在同一个请求中使用 url 查询参数。 POST: http://www.example.com/api/create?pa
这里是原始的 github issue , 支持者建议在这里开一个帖子以获得更多公众支持。 我正在使用 xcode 6.4。 $ pod --version 0.38.2 我的播客文件: platfo
我在项目中使用cocoapods安装alamofire,它在模拟器中运行良好。当我想在 iphone 6s(ios 13.3.1) 上运行我的应用程序时,它崩溃并显示错误消息。我的 Xcode 版本是
如何取消 Alamofire 共享管理器中的所有请求? 这是我的功能: class func cancelAllRequests() { Alamofire.Manager.sharedIns
我想有多个适配器到同一个 SessionManager,这可能吗? 我的用例是: 从适配器设置默认 header 如果是 basic_auth:添加 basic_auth_adapter 如果是tok
调用 Alamofireobject 映射器的正确方法吗? 有人对我的问题提出建议吗? 最佳答案 func postRequestSample() { let
我是 IOS 的新手,这是我的第一个项目,我想在我的项目中使用 Alamofire 库 我按照所有步骤使用 Cocoapods 安装库,一切都应该正常工作,但我收到这个错误“No这样的模块'Alamo
我是 Swift 的新手,来自 Alamorefire Referencee , 你可以做以下的请求 Alamofire.request(.GET, "http://httpbin.org/get")
默认情况下,Alamofire 发送一个包含 gzip 的 Accept-Encoding header 。我如何告诉它停止这样做?我确实接受 gzip,我很高兴 Alamofire 为我解析它,但是
AFImage 的新功能。我不确定这是否是获取图像并将其缓存的正确方法。似乎每次运行时它都没有访问服务器,但我不确定它是否被缓存了?我走运了?看来我在下面使用的语法也过时了...... 任何评论表示赞
我检查了新的 Alamofire 安装步骤。 由于我需要针对 iOS 7.0,我想知道是否导入 Alamofire.swift是否足以让它工作? 为什么文档声明将函数包裹在 Struct Alamof
在 Alamofire 5 Beta 中,SessionManager已被 Session 取代. 我想知道现在分配 RequestAdapter 的过程是什么,因为这是一个 var在 Alamofi
任何人都可以提出一些关于如何使用 header 扩展 alamofire 的建议,例如需要在发送之前设置的 Content-MD5? 最佳答案 这是一个有点老的问题,但我遇到了同样的问题,我使用以下代
有没有人看到用指纹而不是公钥来固定 Alamofire 的方法? 对不起,如果这已经得到回答,我还没有在任何地方看到它。 谢谢 最佳答案 这最终变得非常简单。下面的代码可能并不完美,我的真实代码正在做
我想运行一个 Alamofire 请求,该请求使用先前 Alamofire 请求的结果作为参数。为了简单起见: //Code1 Alamofire.request("URL", met
当我尝试在应用程序中的 Xcode 中运行我的 iOS 应用程序时: dyld: Library not loaded: @rpath/Alamofire.framework/Alamofire
我想运行一个使用先前 Alamofire 请求的结果作为参数的 Alamofire 请求。为简单起见: //Code1 Alamofire.request("URL", method:
更新:我解决了这个问题。请在下面查看我的回答(在问题和评论下方)。 这个问题被标记为重复,但它是不同的,因为它是一个全新的错误,我无法通过任何搜索找到它。 我尝试将 Alamofire 安装到我的 X
我想先 POST 到一个网站,然后 GET 另一个网站获取数据。 并更改 POST 中的 key ,并在 for 循环中继续这样做 5 次以获得不同的数据。 但是,程序总是先运行 POST 5 次,然
我正在使用 Alamofire 5(测试版 1)为 WooCommerce 编写 API 客户端,这将允许我获取订单、优惠券等以及创建它们。注意我使用的是新的 .responseDecodable功能
我是一名优秀的程序员,十分优秀!