Swift 3 URLSession.shared() 对成员 'dataTask(with:completionHandler:) 错误的引用不明确(bug)
Swift 3 URLSession.shared() Ambiguous reference to member 'dataTask(with:completionHandler:) error (bug)
您好,我正在 json 解析 swift2.2 的代码,但是当我将它用于 Swift 3.0 时,出现了错误
ViewController.swift:132:31: Ambiguous reference to member 'dataTask(with:completionHandler:)'
我的代码在这里
let listUrlString = "http://bla.com?batchSize=" + String(batchSize) + "&fromIndex=" + String(fromIndex)
let myUrl = URL(string: listUrlString);
let request = NSMutableURLRequest(url:myUrl!);
request.httpMethod = "GET";
let task = URLSession.shared().dataTask(with: request) {
data, response, error in
if error != nil {
print(error!.localizedDescription)
DispatchQueue.main.sync(execute: {
AWLoader.hide()
})
return
}
do {
let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? NSArray
if let parseJSON = json {
var items = self.categoryList
items.append(contentsOf: parseJSON as! [String])
if self.fromIndex < items.count {
self.categoryList = items
self.fromIndex = items.count
DispatchQueue.main.async(execute: {
self.categoriesTableView.reloadData()
AWLoader.hide()
})
}else if( self.fromIndex == items.count){
DispatchQueue.main.async(execute: {
AWLoader.hide()
})
}
}
} catch {
AWLoader.hide()
print(error)
}
}
task.resume()
谢谢你的想法。
编译器被函数签名弄糊涂了。您可以这样修复它:
let task = URLSession.shared.dataTask(with: request as URLRequest) {
但是,请注意,我们不必在此签名中将 "request" 强制转换为 URLRequest
如果 它之前已声明为 URLRequest
而不是 NSMutableURLRequest
:
var request = URLRequest(url:myUrl!)
这是 NSMutableURLRequest
和新的 URLRequest
之间的自动转换失败,迫使我们在这里进行转换。
您已将 myRequest
初始化为 NSMutableURLRequest
,您需要:
var URLRequest
Swift 正在放弃 NSMutable...
这两个东西。只需将 var
用于新的 类.
已测试 xcode 8 稳定版; 需要将 var request
变量与 URLRequest()
一起使用,这样你就可以轻松修复(错误)
var request = URLRequest(url:myUrl!)
和
let task = URLSession.shared().dataTask(with: request as URLRequest) { }
工作得很好!谢谢你们,我认为可以帮助很多人。 !
这个问题是因为 URLSession 有两个 dataTask 方法
open func dataTask(with request: URLRequest, completionHandler: @escaping (Data?, URLResponse?, Error?) -> Swift.Void) -> URLSessionDataTask
open func dataTask(with url: URL, completionHandler: @escaping (Data?, URLResponse?, Error?) -> Swift.Void) -> URLSessionDataTask
第一个有URLRequest
参数,第二个有URL
参数,所以我们需要指定调用哪种类型,比如我要调用第二个方法
let task = URLSession.shared.dataTask(with: url! as URL) {
data, response, error in
// Handler
}
Xcode 8 和 Swift 3.0
使用 URLSession:
let url = URL(string:"Download URL")!
let req = NSMutableURLRequest(url:url)
let config = URLSessionConfiguration.default
let session = URLSession(configuration: config, delegate: self, delegateQueue: OperationQueue.main)
let task : URLSessionDownloadTask = session.downloadTask(with: req as URLRequest)
task.resume()
URLSession 委托调用:
func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) {
}
func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask,
didWriteData bytesWritten: Int64, totalBytesWritten writ: Int64, totalBytesExpectedToWrite exp: Int64) {
print("downloaded \(100*writ/exp)" as AnyObject)
}
func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL){
}
使用块 GET/POST/PUT/DELETE:
let request = NSMutableURLRequest(url: URL(string: "Your API URL here" ,param: param))!,
cachePolicy: .useProtocolCachePolicy,
timeoutInterval:"Your request timeout time in Seconds")
request.httpMethod = "GET"
request.allHTTPHeaderFields = headers as? [String : String]
let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest) {data,response,error in
let httpResponse = response as? HTTPURLResponse
if (error != nil) {
print(error)
} else {
print(httpResponse)
}
DispatchQueue.main.async {
//Update your UI here
}
}
dataTask.resume()
对我来说效果很好..尝试一下 100% 结果保证
// prepare json data
let mapDict = [ "1":"First", "2":"Second"]
let json = [ "title":"ABC" , "dict": mapDict ] as [String : Any]
let jsonData : NSData = NSKeyedArchiver.archivedData(withRootObject: json) as NSData
// create post request
let url = NSURL(string: "http://httpbin.org/post")!
let request = NSMutableURLRequest(url: url as URL)
request.httpMethod = "POST"
// insert json data to the request
request.httpBody = jsonData as Data
let task = URLSession.shared.dataTask(with: request as URLRequest){ data,response,error in
if error != nil{
return
}
do {
let result = try JSONSerialization.jsonObject(with: data!, options: []) as? [String:AnyObject]
print("Result",result!)
} catch {
print("Error -> \(error)")
}
}
task.resume()
要通过 GET 请求加载数据,您不需要任何 URLRequest
(也不需要分号)
let listUrlString = "http://bla.com?batchSize=" + String(batchSize) + "&fromIndex=" + String(fromIndex)
let myUrl = URL(string: listUrlString)!
let task = URLSession.shared.dataTask(with: myUrl) { ...
对我来说,我这样做是为了找到,
let url = URL(string: urlString)
URLSession.shared.dataTask(with: url!) { (data, response, error) in ...}
无法使用
"let url = NSURL(string: urlString)
对于 Swift 3 和 Xcode 8:
var dataTask: URLSessionDataTask?
if let url = URL(string: urlString) {
self.dataTask = URLSession.shared.dataTask(with: url, completionHandler: { (data, response, error) in
if let error = error {
print(error.localizedDescription)
} else if let httpResponse = response as? HTTPURLResponse, httpResponse.statusCode == 200 {
// You can use data received.
self.process(data: data as Data?)
}
})
}
}
//注意:您可以随时使用调试器检查错误
在swift 3 中,编译器被函数签名弄糊涂了。指定它将清除错误。同时将 url 字符串转换为类型 URL。以下代码对我有用。
let urlString = "http://bla.com?batchSize="
let pathURL = URL(string: urlString)!
var urlRequest = URLRequest(url:pathURL)
let session = URLSession.shared
let dataTask = session.dataTask(with: urlRequest as URLRequest) { (data,response,error) in
let task = URLSession.shared.dataTask(with: request as URLRequest, completionHandler: { data,response,error in
if error != nil{
print(error!.localizedDescription)
return
}
if let responseJSON = (try? JSONSerialization.jsonObject(with: data!, options: [])) as? [String:AnyObject]{
if let response_token:String = responseJSON["token"] as? String {
print("Singleton Firebase Token : \(response_token)")
completion(response_token)
}
}
})
task.resume()
Swift 3 的简短回答:
guard let requestUrl = URL(string: yourURL) else { return }
let request = URLRequest(url:requestUrl)
URLSession.shared.dataTask(with: request) {
(data, response, error) in
...
}.resume()
在我的案例中,错误出现在 NSURL
let url = NSURL(string: urlString)
在 Swift 3 中你必须只写 URL:
let url = URL(string: urlString)
Xcode10.1Swift4
这对我有用:
let task: URLSessionDataTask = session.dataTask(with: request as URLRequest) { (data, response, error) -> Void in
...
关键是在 URLSessionDataTask
类型声明中添加。
您好,我正在 json 解析 swift2.2 的代码,但是当我将它用于 Swift 3.0 时,出现了错误
ViewController.swift:132:31: Ambiguous reference to member 'dataTask(with:completionHandler:)'
我的代码在这里
let listUrlString = "http://bla.com?batchSize=" + String(batchSize) + "&fromIndex=" + String(fromIndex)
let myUrl = URL(string: listUrlString);
let request = NSMutableURLRequest(url:myUrl!);
request.httpMethod = "GET";
let task = URLSession.shared().dataTask(with: request) {
data, response, error in
if error != nil {
print(error!.localizedDescription)
DispatchQueue.main.sync(execute: {
AWLoader.hide()
})
return
}
do {
let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? NSArray
if let parseJSON = json {
var items = self.categoryList
items.append(contentsOf: parseJSON as! [String])
if self.fromIndex < items.count {
self.categoryList = items
self.fromIndex = items.count
DispatchQueue.main.async(execute: {
self.categoriesTableView.reloadData()
AWLoader.hide()
})
}else if( self.fromIndex == items.count){
DispatchQueue.main.async(execute: {
AWLoader.hide()
})
}
}
} catch {
AWLoader.hide()
print(error)
}
}
task.resume()
谢谢你的想法。
编译器被函数签名弄糊涂了。您可以这样修复它:
let task = URLSession.shared.dataTask(with: request as URLRequest) {
但是,请注意,我们不必在此签名中将 "request" 强制转换为 URLRequest
如果 它之前已声明为 URLRequest
而不是 NSMutableURLRequest
:
var request = URLRequest(url:myUrl!)
这是 NSMutableURLRequest
和新的 URLRequest
之间的自动转换失败,迫使我们在这里进行转换。
您已将 myRequest
初始化为 NSMutableURLRequest
,您需要:
var URLRequest
Swift 正在放弃 NSMutable...
这两个东西。只需将 var
用于新的 类.
已测试 xcode 8 稳定版; 需要将 var request
变量与 URLRequest()
一起使用,这样你就可以轻松修复(错误)
var request = URLRequest(url:myUrl!)
和
let task = URLSession.shared().dataTask(with: request as URLRequest) { }
工作得很好!谢谢你们,我认为可以帮助很多人。 !
这个问题是因为 URLSession 有两个 dataTask 方法
open func dataTask(with request: URLRequest, completionHandler: @escaping (Data?, URLResponse?, Error?) -> Swift.Void) -> URLSessionDataTask
open func dataTask(with url: URL, completionHandler: @escaping (Data?, URLResponse?, Error?) -> Swift.Void) -> URLSessionDataTask
第一个有URLRequest
参数,第二个有URL
参数,所以我们需要指定调用哪种类型,比如我要调用第二个方法
let task = URLSession.shared.dataTask(with: url! as URL) {
data, response, error in
// Handler
}
Xcode 8 和 Swift 3.0
使用 URLSession:
let url = URL(string:"Download URL")!
let req = NSMutableURLRequest(url:url)
let config = URLSessionConfiguration.default
let session = URLSession(configuration: config, delegate: self, delegateQueue: OperationQueue.main)
let task : URLSessionDownloadTask = session.downloadTask(with: req as URLRequest)
task.resume()
URLSession 委托调用:
func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) {
}
func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask,
didWriteData bytesWritten: Int64, totalBytesWritten writ: Int64, totalBytesExpectedToWrite exp: Int64) {
print("downloaded \(100*writ/exp)" as AnyObject)
}
func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL){
}
使用块 GET/POST/PUT/DELETE:
let request = NSMutableURLRequest(url: URL(string: "Your API URL here" ,param: param))!,
cachePolicy: .useProtocolCachePolicy,
timeoutInterval:"Your request timeout time in Seconds")
request.httpMethod = "GET"
request.allHTTPHeaderFields = headers as? [String : String]
let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest) {data,response,error in
let httpResponse = response as? HTTPURLResponse
if (error != nil) {
print(error)
} else {
print(httpResponse)
}
DispatchQueue.main.async {
//Update your UI here
}
}
dataTask.resume()
对我来说效果很好..尝试一下 100% 结果保证
// prepare json data
let mapDict = [ "1":"First", "2":"Second"]
let json = [ "title":"ABC" , "dict": mapDict ] as [String : Any]
let jsonData : NSData = NSKeyedArchiver.archivedData(withRootObject: json) as NSData
// create post request
let url = NSURL(string: "http://httpbin.org/post")!
let request = NSMutableURLRequest(url: url as URL)
request.httpMethod = "POST"
// insert json data to the request
request.httpBody = jsonData as Data
let task = URLSession.shared.dataTask(with: request as URLRequest){ data,response,error in
if error != nil{
return
}
do {
let result = try JSONSerialization.jsonObject(with: data!, options: []) as? [String:AnyObject]
print("Result",result!)
} catch {
print("Error -> \(error)")
}
}
task.resume()
要通过 GET 请求加载数据,您不需要任何 URLRequest
(也不需要分号)
let listUrlString = "http://bla.com?batchSize=" + String(batchSize) + "&fromIndex=" + String(fromIndex)
let myUrl = URL(string: listUrlString)!
let task = URLSession.shared.dataTask(with: myUrl) { ...
对我来说,我这样做是为了找到,
let url = URL(string: urlString)
URLSession.shared.dataTask(with: url!) { (data, response, error) in ...}
无法使用
"let url = NSURL(string: urlString)
对于 Swift 3 和 Xcode 8:
var dataTask: URLSessionDataTask?
if let url = URL(string: urlString) {
self.dataTask = URLSession.shared.dataTask(with: url, completionHandler: { (data, response, error) in
if let error = error {
print(error.localizedDescription)
} else if let httpResponse = response as? HTTPURLResponse, httpResponse.statusCode == 200 {
// You can use data received.
self.process(data: data as Data?)
}
})
}
}
//注意:您可以随时使用调试器检查错误
在swift 3 中,编译器被函数签名弄糊涂了。指定它将清除错误。同时将 url 字符串转换为类型 URL。以下代码对我有用。
let urlString = "http://bla.com?batchSize="
let pathURL = URL(string: urlString)!
var urlRequest = URLRequest(url:pathURL)
let session = URLSession.shared
let dataTask = session.dataTask(with: urlRequest as URLRequest) { (data,response,error) in
let task = URLSession.shared.dataTask(with: request as URLRequest, completionHandler: { data,response,error in
if error != nil{
print(error!.localizedDescription)
return
}
if let responseJSON = (try? JSONSerialization.jsonObject(with: data!, options: [])) as? [String:AnyObject]{
if let response_token:String = responseJSON["token"] as? String {
print("Singleton Firebase Token : \(response_token)")
completion(response_token)
}
}
})
task.resume()
Swift 3 的简短回答:
guard let requestUrl = URL(string: yourURL) else { return }
let request = URLRequest(url:requestUrl)
URLSession.shared.dataTask(with: request) {
(data, response, error) in
...
}.resume()
在我的案例中,错误出现在 NSURL
let url = NSURL(string: urlString)
在 Swift 3 中你必须只写 URL:
let url = URL(string: urlString)
Xcode10.1Swift4
这对我有用:
let task: URLSessionDataTask = session.dataTask(with: request as URLRequest) { (data, response, error) -> Void in
...
关键是在 URLSessionDataTask
类型声明中添加。