NSURLSessionDataTask возвращает данные в обработчике завершения, Swift 2.0
Я прочитал несколько других вопросов об этой же проблеме, но каким-то образом обработчик завершения работает по-другому для других ответов. Кроме того, эти ответы с 2015 года, что заставляет меня задуматься, относится ли он к Swift 1.x
В любом случае, вот моя проблема. Я делаю обычный вызов GET и хочу вернуть загруженные данные вызывающему методу. Как-то это не хочет работать для меня.
Вот код того, что я делаю (все внутри одного класса ViewController):
override func viewDidLoad() {
super.viewDidLoad()
// get initial GET call
getConfigurationLink();
}
func getConfigurationLink(completionHandler:String?) -> Void
{
let collectionUrl = NSURL(string: collectionUrlString);
let configuration = NSURLSessionConfiguration.defaultSessionConfiguration();
let headers: [NSObject : AnyObject] = ["Accept":"application/json"];
configuration.HTTPAdditionalHeaders = headers;
let session = NSURLSession(configuration: configuration);
let configurationUrlTask = session.dataTaskWithURL(collectionUrl!) {(data, response, error) in
completionHandler("test")
}
configurationUrlTask.resume()
}
С этим кодом строка completionHandler("test")
не компилируется с Cannot call value of non-function type String?
сообщение.
Итак, мой вопрос:
Как создать conpletionHandler, который я могу передать в качестве аргумента методу?
Почему происходит сбой обработчика завершения?
Без обработчика завершения метод просто возвращает нулевое значение до завершения сетевого вызова, как и ожидалось.
Благодарю.
1 ответ
В вашем текущем типе определения функции completionHandler
необязательный String, это не функция. Если ты хочешь completionHandler
чтобы быть функцией, которую вы вызываете, когда задача данных завершается, измените определение функции на func getConfigurationLink(completionHandler: String? -> ())
, Так вот completionHandler
это функция, которая принимает необязательную строку в качестве параметра
Вы можете прочитать о том, как передать функцию в качестве типа параметра для другой функции (это то, что вы пытаетесь сделать здесь, вы передаете completionHandler
функция к getConfigurationLink
а потом звонит completionHandler
после завершения сетевого запроса) здесь: https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Functions.html
И еще немного объяснений о CompetletionHandlers: https://thatthinginswift.com/completion-handlers/
Ты можешь позвонить getConfigurationLink
используя замыкание вот так:
getConfigurationLink { (str: String?) in
// you can use str here
}
Вот дополнительная информация о замыканиях: https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html