NSURLSessionDataTask return 完成处理程序中的数据,Swift 2.0
NSURLSessionDataTask return data in completion handler, Swift 2.0
我已经阅读了关于同一问题的其他几个问题,但不知何故,完成处理程序对于其他答案的工作方式有所不同。此外,这些答案来自 2015 年,这让我想知道它是否特定于 Swift 1.x
无论如何,这是我的问题。我正在进行常规 GET 调用,我想 return 将下载的数据发送到调用方法。不知何故,这对我不起作用。
这是我正在做的代码(全部在一个 ViewController class 中):
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?
为什么完成处理程序失败?
在没有完成处理程序的情况下,该方法只是 return 在网络调用完成之前的一个空值,正如预期的那样。
谢谢。
在您当前的函数定义类型中,completionHandler
是可选的字符串,它不是一个函数。如果您希望 completionHandler
成为您在数据任务完成时调用的函数,请将函数定义更改为 func getConfigurationLink(completionHandler: String? -> ())
。所以这里 completionHandler
是一个函数,它接受一个可选的字符串作为参数。
您可以阅读如何将一个函数作为另一个函数的参数类型传递(这就是您在这里尝试做的,您将 completionHandler
函数传递给 getConfigurationLink
,然后网络请求完成时调用 completionHandler
)这里: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/
您可以像这样使用闭包调用 getConfigurationLink
:
getConfigurationLink { (str: String?) in
// you can use str here
}
这里有更多关于闭包的信息:https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html
我已经阅读了关于同一问题的其他几个问题,但不知何故,完成处理程序对于其他答案的工作方式有所不同。此外,这些答案来自 2015 年,这让我想知道它是否特定于 Swift 1.x
无论如何,这是我的问题。我正在进行常规 GET 调用,我想 return 将下载的数据发送到调用方法。不知何故,这对我不起作用。
这是我正在做的代码(全部在一个 ViewController class 中):
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?
为什么完成处理程序失败?
在没有完成处理程序的情况下,该方法只是 return 在网络调用完成之前的一个空值,正如预期的那样。
谢谢。
在您当前的函数定义类型中,completionHandler
是可选的字符串,它不是一个函数。如果您希望 completionHandler
成为您在数据任务完成时调用的函数,请将函数定义更改为 func getConfigurationLink(completionHandler: String? -> ())
。所以这里 completionHandler
是一个函数,它接受一个可选的字符串作为参数。
您可以阅读如何将一个函数作为另一个函数的参数类型传递(这就是您在这里尝试做的,您将 completionHandler
函数传递给 getConfigurationLink
,然后网络请求完成时调用 completionHandler
)这里: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/
您可以像这样使用闭包调用 getConfigurationLink
:
getConfigurationLink { (str: String?) in
// you can use str here
}
这里有更多关于闭包的信息:https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html