在 Swift 3 中获取将 NSURLSession 转换为 URLSession 的错误
Getting errors for conversion NSURLSession to URLSession in Swift 3
我尝试在 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:)'
为什么会出现这个错误?
你只需要在Swift 3
中更改
session.dataTask(with: url!) { (data, response, error) -> Void in
到
session.dataTask(with: url as URLRequest) {
data, response, error in
在 Swift 3
中尝试以下 URLSession 代码
//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
}
您收到此错误是因为在 Swift 3 中他们使用了所有 API 和 URL
而不是 NSURL
,因此只需创建 [=12] 的对象=] 而不是 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
。
我尝试在 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:)'
为什么会出现这个错误?
你只需要在Swift 3
中更改session.dataTask(with: url!) { (data, response, error) -> Void in
到
session.dataTask(with: url as URLRequest) {
data, response, error in
在 Swift 3
中尝试以下 URLSession 代码//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
}
您收到此错误是因为在 Swift 3 中他们使用了所有 API 和 URL
而不是 NSURL
,因此只需创建 [=12] 的对象=] 而不是 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
。