作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我通过使用 swift 创建的 API 进行 url 调用,如下所示:
class API {
let apiEndPoint = "endpoint"
let apiUrl:String!
let consumerKey:String!
let consumerSecret:String!
var returnData = [:]
init(){
self.apiUrl = "https://myurl.com/"
self.consumerKey = "my consumer key"
self.consumerSecret = "my consumer secret"
}
func getOrders() -> NSDictionary{
return makeCall("orders")
}
func makeCall(section:String) -> NSDictionary{
let params = ["consumer_key":"key", "consumer_secret":"secret"]
Alamofire.request(.GET, "\(self.apiUrl)/\(self.apiEndPoint + section)", parameters: params)
.authenticate(user: self.consumerKey, password: self.consumerSecret)
.responseJSON { (request, response, data, error) -> Void in
println("error \(request)")
self.returnData = data! as NSDictionary
}
return self.returnData
}
}
我在 UITableViewController
中调用此 API,以使用 SwiftyJSON 库填充表。但是,我的 API returnData
始终为空。 Alomofire 调用没有问题,因为我可以成功检索值。我的问题是我应该如何将此数据
传递到我的 TableView Controller ?
var api = API()
api.getOrders()
println(api.returnData) // returnData is empty
最佳答案
正如 mattt 指出的那样,Alamofire 通过“完成处理程序”模式异步返回数据,因此您也必须这样做。您不能立即返回
值,而是希望将方法更改为不返回任何内容,而是使用完成处理程序闭包模式。
现在,这可能看起来像:
func getOrders(completionHandler: @escaping (Result<[String: Any]>) -> Void) {
performRequest("orders", completion: completionHandler)
}
func performRequest(_ section: String, completion: @escaping (Result<[String: Any]>) -> Void) {
let url = baseURL.appendingPathComponent(section)
let params = ["consumer_key": "key", "consumer_secret": "secret"]
Alamofire.request(url, parameters: params)
.authenticate(user: consumerKey, password: consumerSecret)
.responseJSON { response in
switch response.result {
case .success(let value as [String: Any]):
completion(.success(value))
case .failure(let error):
completion(.failure(error))
default:
fatalError("received non-dictionary JSON response")
}
}
}
然后,当您想要调用它时,可以使用此 completion
闭包参数(如果需要,可以在尾随闭包中):
api.getOrders { result in
switch result {
case .failure(let error):
print(error)
case .success(let value):
// use `value` here
}
}
// but don't try to use the `error` or `value`, as the above closure
// has not yet been called
//
关于ios - 如何从 Alamofire 返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55433608/
我是一名优秀的程序员,十分优秀!