Как использовать NSURLSessionDataTask в Swift
Может кто-нибудь мне помочь? Я не могу найти хороший пример синтаксиса завершения.
var url : NSURL = NSURL.URLWithString("https://itunes.apple.com/search?term=\(searchTerm)&media=software")
var request: NSURLRequest = NSURLRequest(URL:url)
let config = NSURLSessionConfiguration.defaultSessionConfiguration()
let session = NSURLSession.sessionWithConfiguration(config)
NSURLSessionDataTask(session.dataTaskWithRequest(request, completionHandler: ((NSData!, NSURLResponse!, NSError!) -> Void)?)
Спасибо!
Ответы
Ответ 1
Это непонятно, что вы спрашиваете, но я заметил, что у вас есть пара ошибок в коде:
-
Вы должны создать session
с помощью NSURLSession(configuration: config)
-
session.dataTaskWithRequest
возвращает a NSURLSessionDataTask
, поэтому нет необходимости обертывать его внутри NSURLSessionDataTask()
(a.k.a создает экземпляр нового объекта NSURLSessionDataTask
).
-
Обработчик завершения - это замыкание, и здесь вы создаете эту особую оболочку:
{(data : NSData!, response : NSURLResponse!, error : NSError!) in
// your code
}
Здесь обновленный код:
let url = NSURL(string: "https://itunes.apple.com/search?term=\(searchTerm)&media=software")
let request = NSURLRequest(URL: url)
let config = NSURLSessionConfiguration.defaultSessionConfiguration()
let session = NSURLSession(configuration: config)
let task = session.dataTaskWithRequest(request, completionHandler: {(data, response, error) in
// notice that I can omit the types of data, response and error
// your code
});
// do whatever you need with the task e.g. run
task.resume()
Ответ 2
Если у вас возникли проблемы с синтаксисом завершения, вы можете создать функцию для завершения до вызова dataTaskWithRequest (..), чтобы сделать ее более ясной
func handler (data: NSData!, response: NSURLResponse!, error: NSError!) {
//handle what you need
}
session.dataTaskWithRequest(request, completionHandler: handler)
Ответ 3
Вы также можете использовать его просто: -
let url = "api url"
let nsURL = NSURL
let task = NSURLSession.sharedSession().dataTaskWithURL(nsURL) {
(data, response, error) in
// your condition on success and failure
}
task.resume()
Ответ 4
Обновлен код @duemonk для Swift 3:
do {
var request = URLRequest(url: URL(string: "https://www.example.com/api/v1")!, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0)
let config = URLSessionConfiguration.default
let session = URLSession(configuration: config)
let task = session.dataTask(with: request, completionHandler: {(data, response, error) in
if error != nil {
print(error!.localizedDescription)
}
else {
print(response)
}
})
task.resume()
}
catch {
// handle the error
}
Ответ 5
session.dataTaskWithRequest(request, completionHandler: {(data: NSData!, response: NSURLResponse!, error: NSError!) in
//code
)}
Надеемся, что Xcode будет обновлен, чтобы поддерживать автоматическое завершение для них, потому что синтаксис является довольно сложным, и Swift, похоже, не поддерживает объявление типа возврата еще при использовании как это.