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? 消息。

所以我的问题是:

  1. 如何创建一个可以作为参数传递给方法的 conpletionHandler?

  2. 为什么完成处理程序失败?

在没有完成处理程序的情况下,该方法只是 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