使用 AFNetworking 的 Swift 3
Posted
技术标签:
【中文标题】使用 AFNetworking 的 Swift 3【英文标题】:Swift 3 using AFNetworking 【发布时间】:2016-12-09 06:53:28 【问题描述】:我正在将 AFNetworking 与 Swift 3.0 一起使用,但我被困在一个代码上。
func getJSON()
let manager = AFHTTPSessionManager()
manager.get(
url,
parameters: nil,
success:
(operation: URLSessionTask!, responseObject: Any?) in
print("JSON: " + responseObject!.description)
self.matchesArray = responseObject!.object(forKey: "matches")! as? NSMutableArray
self.tollBothPlazaTableView.reloadData()
,
failure:
(operation: URLSessionTask!, error: NSError) in
print("Error: " + error.localizedDescription)
)
它在failure
块上显示错误。
无法将类型 '(URLSessionTask!, NSError) -> ()' 的值转换为预期的参数类型 '((URLSessionDataTask?, Error) -> Void)?'`
谁能解释我的代码有什么问题。还有使用闭包的正确方法吗? (我是 swift 新手)。
【问题讨论】:
【参考方案1】:错误清楚地表明使用Error
而不是NSError
,在Swift 3 中你需要使用Error
而不是NSError
。所以改变你的代码如下。
func getJSON()
let manager = AFHTTPSessionManager()
manager.get(
url,
parameters: nil,
success:
(operation, responseObject) in
if let dic = responseObject as? [String: Any], let matches = dic["matches"] as? [[String: Any]]
print(matches)
DispatchQueue.main.async
self.tollBothPlazaTableView.reloadData()
,
failure:
(operation, error) in
print("Error: " + error.localizedDescription)
)
注意:当你在后台线程上时,总是在主线程上执行 UI 更改,所以像我一样在主线程上重新加载你的 tableView
,同时使用 Swift 本机 Array
和Dictionary
而不是 NSArray
和 NSDictionary
。
【讨论】:
谢谢。这解决了它。那么我应该将我的数组声明为 Array 而不是 NSMutableArray 吗? @thewarri0r9 欢迎朋友,如果它包含像var matchesArray = [[String:Any]]()
这样的字典,则将您的数组声明为字典数组,就像我的答案一样,如果它包含像var matchesArray = [String]()
这样的字符串,则将其声明为字符串数组【参考方案2】:
**最好在swift 3中使用Alamofire(同一个开发者)**
func jsonRequest()
let url = "url"
//if you want to add paramter
parametr = ["username" : "user" , "password"]
Alamofire.request(url, method: .post, parameters: nil, encoding: JSONEncoding.default)
.responseJSON response in
// print(response)
//to get status code
if let status = response.response?.statusCode
switch(status)
case 201:
print("example success")
default:
print("error with response status: \(status)")
//to get JSON return value
if let array = response.result.value as? //NSDictionary [[String : Any]]
【讨论】:
好的没问题,但试试 Alamofire 比 Afnetworing 更好 :-) 快乐编码 但如果你有一个混合项目,并不总是需要两个框架来做同样的事情。 AlamoFire 更好,我们在仅 Swift/大部分项目中使用它——但如果你有 90% 的 ObjC——它就是不实用。以上是关于使用 AFNetworking 的 Swift 3的主要内容,如果未能解决你的问题,请参考以下文章
Swift:在 AFNetworking 调用中关闭的未包装选项