u54*_*54r 57 ios swift alamofire
我通过使用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
}
}
Run Code Online (Sandbox Code Playgroud)
我在我的API中调用这个API UITableViewController来使用SwiftyJSON库填充表.但是我returnData的API总是空的.Alomofire调用没有问题,因为我可以成功检索值.我的问题是我应该怎么把它data带到我的表视图控制器?
var api = API()
api.getOrders()
println(api.returnData) // returnData is empty
Run Code Online (Sandbox Code Playgroud)
Rob*_*Rob 97
正如mattt指出的那样,Alamofire通过return模式异步返回数据,所以你必须这样做.您不能completion立即使用该值,而是希望使用return返回类型,而是使用完成处理程序闭包模式.
在Swift 3和Alamofire 4中,可能看起来像:
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")
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后,当你想调用它时,你使用这个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
//
Run Code Online (Sandbox Code Playgroud)
mat*_*ttt 13
来自Alamofire README(重点补充):
Alamofire中的网络是异步完成的.对于不熟悉这个概念的程序员来说,异步编程可能会让人感到沮丧,但是有很好的理由这样做.
而不是阻止执行以等待来自服务器的响应,而是指定回调一旦收到响应就处理响应.请求的结果仅在响应处理程序的范围内可用.根据响应或从服务器接收的数据执行的任何执行都必须在处理程序内完成.
| 归档时间: |
|
| 查看次数: |
28974 次 |
| 最近记录: |