Я попытался создать простую функцию, которая получает URL-адрес и просто возвращает HTML-код веб-страницы. NSURLSessionDataTask
сам работает, я вижу весь html, когда я println(data)
. Но func
возвращает только начальное значение «# !?». Я подозреваю, что DataTask
работает асинхронно?
Как я могу справиться с этим?NSURLSessionDataTask: func получает, но не возвращает данные
func loadHTML(targetURL: String) -> String {
var theTargetURL = NSURL(string:targetURL)
var theResult = "#!?"
var request: NSURLRequest = NSURLRequest(URL:theTargetURL)
let config = NSURLSessionConfiguration.defaultSessionConfiguration()
let session = NSURLSession(configuration: config)
let task : NSURLSessionDataTask = session.dataTaskWithRequest(request, completionHandler: {(data, response, error) in
println(NSString(data: data, encoding: NSASCIIStringEncoding))
if error != nil {
println(error.localizedDescription)
theResult = "error"
}
if data != nil {
theResult = NSString(data: data, encoding: NSASCIIStringEncoding)
println("RECEIVED\t\t\(countElements(theResult)) CHARS")
}
});
task.resume()
return theResult
}
Вы сделали какие-либо асинхронного программирования раньше? Это асинхронная модель, но функция немедленно возвращается, возвращая немедленное значение. Но запрос требует времени для загрузки и получения содержимого с URL-адреса. Лучше, если вы используете блок завершения в своей функции, так что он вызывается, когда запрос заканчивается. – Sandeep
Я понял, почему он должен быть асинхронным, но я не могу получить рабочий блок завершения. Я не могу отказаться от 'return' в конце' func', в то же время 'return theResult' внутри' if data! = Nil {} 'приводит к тому, что строка String не может быть преобразована в Void-error , Не могли бы вы привести мне пример? – ixany