2016-06-14 115 views
140

你好我有工作json解析代碼爲swift2.2,但是當我用它爲Swift 3.0給我那個錯誤Swift 3 URLSession.shared()對成員'dataTask的歧義引用(with:completionHandler :)錯誤(bug)

ViewController.swift:132:31:曖昧參考成員 'dataTask(附: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() 

感謝的想法。

+1

我得到相同的錯誤,因爲我傳遞一個字符串到'dataTask(帶有:'例如我有'url =「www.yahoo.com',我直接將它傳遞給函數**而沒有**將其轉換爲'URL' – Honey

回答

265

編譯器被函數簽名弄糊塗了。你能解決這個問題是這樣的:

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

但是,請注意,我們沒有投「請求」爲URLRequest在此簽名如果它被宣佈作爲較早而不是URLRequestNSMutableURLRequest

​​

這是NSMutableURLRequest和新的URLRequest之間的自動投射失敗,這迫使我們在這裏進行投射。

+1

謝謝你的工作,我認爲會幫助很多人 – SwiftDeveloper

+5

var request = URLRequest(url:myUrl!)' –

+1

[SE-0072](https://github.com/apple/swift-evolution/blob/master/proposals/0072-eliminate-implicit-bridging-conversions.md)說,刪除隱式橋接當「swifty函數名稱」變成「事實上的覆蓋方法」時,我們不能反向查找Objective-C SEL,所以我們必須使用或者強制轉換爲基礎struct。 – quesera2

30

你init'd myRequestNSMutableURLRequest,你需要這樣的:

var URLRequest 

斯威夫特開溝兩個NSMutable...事情。只需使用var即可獲得新課程。

+2

由於一噸的人。這是完美的解決方案。乾杯! – Blisskarthik

3

經過測試的xcode 8穩定版本;需要使用var request變量,URLRequest()隨着這就是你可以很容易地解決這個問題(錯誤

var request = URLRequest(url:myUrl!)

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

工作得很好!謝謝你們,我想幫助很多人。 !

+1

這是沒有意義的,從鑄的URLRequest到的URLRequest –

+0

'變種請求=的URLRequest(URL:URL); 令任務= URLSession.shared()dataTask(具有:請求)。{...}'' –

+0

shared'是一個屬性,而不是在夫特3的功能(無括號內)。 – vadian

10

此問題是由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 
} 
+0

沒有任何意義。謝謝 – iBug

16

的Xcode 8和夫特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%的結果保證

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

要通過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) { ... 
1

對我來說,我做的這個發現,

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

不能使用

"let url = NSURL(string: urlString) 
1

對於斯威夫特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?) 
       } 
      }) 
     } 
    } 

//注意:您可以隨時使用調試器來檢查錯誤

2

在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 
1
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() 
1

簡短的答案斯威夫特3:

guard let requestUrl = URL(string: yourURL) else { return } 

let request = URLRequest(url:requestUrl) 
URLSession.shared.dataTask(with: request) { 
    (data, response, error) in 
    ... 

}.resume() 
4

在我的情況下誤差在NSURL

let url = NSURL(string: urlString) 

在斯威夫特3,你必須寫只是網址

let url = URL(string: urlString) 
相關問題