Swift 3 URLSession.shared() 对成员 'dataTask(with:completionHandler:) 错误 (bug) 的模糊引用



您好,我有适用于 swift2.2 的 json 解析代码,但是当我将其用于 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,我们不必在此签名中将"request"转换为URLRequest

var request = URLRequest(url:myUrl!)

这是NSMutableURLRequest和新URLRequest之间的自动转换,它失败了,迫使我们在这里进行这种转换。

你有 init 会myRequest NSMutableURLRequest ,你需要这个:

var URLRequest

斯威夫特正在抛弃这两件事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()

网址委托调用:

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){
}

使用块获取/发布/放置/删除:

 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作为参数,所以我们需要指定调用哪个类型,比如我想调用第二个方法

let task = URLSession.shared.dataTask(with: url! as URL) {
    data, response, error in
    // Handler
}

在我的情况下,错误是在 NSURL

let url = NSURL(string: urlString)

在 Swift 3 中,你只需要编写 URL

let url = URL(string: urlString)

测试的 xcode 8 稳定版;需要将var request变量与URLRequest()一起使用 有了它,您可以轻松修复它(错误

var request = URLRequest(url:myUrl!)

let task = URLSession.shared().dataTask(with: request as URLRequest) { }

工作正常!谢谢你们,我想帮助了很多人。!

对于 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。以下代码对我有用。

   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

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()
 // 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 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()

Xcode 10.1 Swift 4

这对我有用:

let task: URLSessionDataTask = session.dataTask(with: request as URLRequest) { (data, response, error) -> Void in
...

键正在添加URLSessionDataTask类型声明。

对我来说,

我这样做是为了找到,

let url = URL(string: urlString)
URLSession.shared.dataTask(with: url!) { (data, response, error) in ...}

不能使用

"let url = NSURL(string: urlString)

最新更新