Swift 3 URL 세션shared() 멤버 'dataTask(with:completionHandler:)'에 대한 애매한 참조 오류(버그)
안녕하세요 저는 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실패해서 이 캐스팅을 하게 된 거죠
init'd가 있습니다.myRequest~하듯이NSMutableURLRequest, 다음이 필요합니다.
var URLRequest
스위프트는 이 두 가지를 모두 버리고 있다.NSMutable...그냥 쓰세요.var새로운 수업을 위해서요.
Xcode 8 및 Swift 3.0
URL 세션 사용:
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()
URL 세션 위임자 호출:
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에 2개의 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 문자열도 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)
언급URL : https://stackoverflow.com/questions/37812286/swift-3-urlsession-shared-ambiguous-reference-to-member-datataskwithcomplet
'programing' 카테고리의 다른 글
| 두 개의 Angular 사용 방법서로 다른 모듈의 동일한 이름을 가진 JS 서비스를 선택하십시오. (0) | 2023.03.13 |
|---|---|
| Angular에서 $resource 서비스 테스트JS (0) | 2023.03.13 |
| AJAX 응답 데이터가 비어 있는지/빈지/null/정의되지 않음/0인지 확인합니다. (0) | 2023.03.08 |
| JSONObject의 잭슨2는 무엇입니까? (0) | 2023.03.08 |
| 개체를 json 문자열 대신 JObject로 직접 직렬화합니다.그물 (0) | 2023.03.08 |