안녕하세요, 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
이 서명의 경우 가 이전과 같이 선언 URLRequest
대신 NSMutableURLRequest
:
var request = URLRequest(url:myUrl!)
이것은 실패한 NSMutableURLRequest
새로운 URLRequest
것 사이의 자동 캐스팅 이며 여기서 우리는이 캐스팅을 수행해야합니다.
답변
당신은 다음 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()
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
매개 변수로 사용하므로 호출 할 유형을 지정해야합니다. 예를 들어 두 번째 방법을 호출하고 싶습니다.
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) { }
잘 작동했습니다! 고맙습니다. 많은 사람들을 도와주세요. !
답변
스위프트 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?)
}
})
}
}
// 참고 : 언제든지 디버거를 사용하여 오류를 확인할 수 있습니다