Swift 3 URLSession.shared()成员'dataTask的模糊引用(with:completionHandler :) error(bug)
你好,我有工作jsonparsing代码为swift2.2,但是当我使用它的Swift 3.0给我这个错误
ViewController.swift:132:31:对成员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) {
但是,请注意, 如果以URLRequest
而不是NSMutableURLRequest
声明URLRequest
,那么我们不必在URLRequest
中input“request”。
var request = URLRequest(url:myUrl!)
这是NSMutableURLRequest
和失败的新URLRequest
之间的自动转换,这迫使我们在这里进行转换。
你已经init'd myRequest
作为NSMutableURLRequest
,你需要这个:
var URLRequest
Swift正在抛弃NSMutable...
东西。 只需使用var
为新的类。
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%的结果保证
这个问题是由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
作为参数,所以我们需要指定要调用的types,例如,我想调用第二个方法
let task = URLSession.shared.dataTask(with: url! as URL) { data, response, error in // Handler }
经过testing的xcode 8稳定版本; 需要与URLRequest()
使用var request
variables用这个,你可以很容易地修复( 错误 )
var request = URLRequest(url:myUrl!)
而
let task = URLSession.shared().dataTask(with: request as URLRequest) { }
工作很好! 谢谢你们,我觉得帮助很多人。 !
// 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) { ...
在swift 3中,编译器被函数签名弄糊涂了。 指定它将清除错误。 还要将urlstring转换为URLtypes。 下面的代码为我工作。
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
在我的情况下错误是在NSURL
let url = NSURL(string: urlString)
在Swift 3中,你必须写下URL :
let url = URL(string: urlString)
对我来说,我这样做是为了find,
let url = URL(string: urlString) URLSession.shared.dataTask(with: url!) { (data, response, error) in ...}
不能使用
"let url = NSURL(string: urlString)
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()
对于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?) } }) } }
//注意:你总是可以使用debugging器来检查错误