我已经阅读了关于同一问题的其他几个问题,但不知何故,完成处理程序对其他答案的工作方式不同。此外,这些答案来自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?
为什么完成处理程序失败?
如果没有完成处理程序,该方法只会在网络调用完成之前返回一个空值,如预期的那样。
感谢。
答案 0 :(得分:0)
在您当前的函数定义中,completionHandler
的类型是可选的String,它不是函数。如果希望completionHandler
成为数据任务完成时调用的函数,请将函数定义更改为func getConfigurationLink(completionHandler: String? -> ())
。所以这里completionHandler
是一个将可选String作为参数的函数。
您可以阅读如何将函数作为另一个函数的参数类型传递(这是您在此尝试做的事情,您将completionHandler
函数传递给{ {1}}然后在网络请求完成时调用getConfigurationLink
:https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Functions.html#//apple_ref/doc/uid/TP40014097-CH10-ID166
关于compeletionHandlers的更多解释:https://thatthinginswift.com/completion-handlers/
你可以使用这样的闭包来调用completionHandler
:
getConfigurationLink
以下是有关闭包的更多信息:https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html