2016-11-08 10 views
0

Я попытался преобразовать код ниже на Swift 3:Получение ошибок для преобразования NSURLSession в URLSession в Swift 3

session.dataTaskWithURL(url! as URL, completionHandler: { (data : NSData?, response : URLResponse?, error : NSError?) -> Void in 

       if error != nil { 
        callback(items: nil, errorDescription: error!.localizedDescription, placesDetail: []) 
       } 

       if let statusCode = response as? NSHTTPURLResponse { 
        if statusCode.statusCode != 200 { 
         callback(items: nil, errorDescription: "Could not continue. HTTP Status Code was \(statusCode)", placesDetail: []) 
        } 
       } 

       NSOperationQueue.mainQueue().addOperationWithBlock({() -> Void in 
        callback(items: GooglePlaces.parseFromData(data!), errorDescription: nil, placesDetail: GooglePlaces.arrayPlaces(data!)) 
       }) 
      }).resume() 

Так я это делаю:

session.dataTask(with: url!) { (data, response, error) -> Void in 

       if error != nil { 
        callback(items: nil, errorDescription: error!.localizedDescription, placesDetail: []) 
       } 

       if let statusCode = response as? NSHTTPURLResponse { 
        if statusCode.statusCode != 200 { 
         callback(items: nil, errorDescription: "Could not continue. HTTP Status Code was \(statusCode)", placesDetail: []) 
        } 
       } 

       OperationQueue.main.addOperation { 
        callback(items: GooglePlaces.parseFromData(data!), errorDescription: nil, placesDetail: GooglePlaces.arrayPlaces(data!)) 
       } 
      } 

Но эта ошибка:

Ambiguous reference to member 'dataTask(with:completionHandler:)'

Зачем нужна эта ошибка?

+0

Вам нужно использовать URL вместо NSURL –

ответ

0

Вам нужно изменить только в Swift 3

session.dataTask(with: url!) { (data, response, error) -> Void in 

в

session.dataTask(with: url as URLRequest) { 
      data, response, error in 

Попробуйте ниже код для URLSession в Swift 3

//MARK:- Parsing API here 
    public static func getparseMyApi(_ input: String, action:String, completion: @escaping (_ result: String, _ error: NSError?) -> Void) { 

     //Main API here 
     let is_URL: String = "http://yourURLhere.com" 

     let lobj_Request = NSMutableURLRequest(url: URL(string: is_URL)!) 
     let session = URLSession.shared 

     lobj_Request.httpMethod = "POST" 
     lobj_Request.httpBody = input.data(using: String.Encoding.utf8) 
     //lobj_Request.addValue("www.cgsapi.com", forHTTPHeaderField: "Host") 
     lobj_Request.addValue("text/xml; charset=utf-8", forHTTPHeaderField: "Content-Type") 
     lobj_Request.addValue(String(input.characters.count), forHTTPHeaderField: "Content-Length") 
     lobj_Request.addValue("http://tempuri.org/IService/\(action)", forHTTPHeaderField: "SOAPAction") 


     let task = session.dataTask(with: lobj_Request as URLRequest) { 
      data, response, error in 
      print("Response: \(response)") 

      // Checking here Response 
     if response != nil { 

      let statusCode = (response as! HTTPURLResponse).statusCode 
      print("Success: \(statusCode)") 

      // Checking here Response Status 
     if statusCode == 200 { 
      //Handling Data here 
      if data?.count > 0 { 
       //Do something here with data 
       let strData = NSString(data: data!, encoding: String.Encoding.utf8.rawValue) 
       // Finish here Process 
       completion(strData, nil) 
      }else{ 
       //Data nil Condition here 
       completion("", error as NSError?) 
      } 

      //Handling Error here 
      if error != nil 
      { 
       print("Error: " + error.debugDescription) 
       completion("", error as NSError?) 
      } 

      }else{ 
       //Invalid Status 
       print("Error: " + error.debugDescription) 
       completion("", error as NSError?) 
      } 

     }else{ 
      //Response Nil then handle here 
      print("Error: " + error.debugDescription) 
      completion("", error as NSError?) 
     } 

     } 
     task.resume() 
    } 

    //MARK:- String To Dictionary Conversion 
    public static func convertStringToDictionary(_ json: String) -> [String: AnyObject]? { 
     if let data = json.data(using: String.Encoding.utf8) { 
      do{ 
       let json = try JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions()) as? [String: AnyObject] 
       print(json) 
       return json 
      }catch { 
       print(error) 
      } 
     } 
     return nil 
    } 
1

Вы получаете эту ошибку, потому что в Swift 3 они использовали весь API с URL, а не NSURL, поэтому просто создайте объект URL вместо NSURL и передайте в качестве первого аргумента dataTask(with:completionHandler:).

let url = URL(string: stringURL) 
//Now this will works for you 
session.dataTask(with: url!) { (data, response, error) -> Void in 

Для получения более подробной информации об этой проверке URLSession документации.

Примечание: Вы также можете использовать.

dataTask(with request: URLRequest, completionHandler: @escaping (Data?, URLResponse?, Error?) -> Void) -> URLSessionDataTask 

Но для этого нужно создать URLRequest объект не NSURLRequest.