NSURLSessionDataTask在完成处理程序Swift 2.0中返回数据

时间:2016-06-05 01:58:49

标签: ios nsurlsession nsurlsessiondatatask

我已经阅读了关于同一问题的其他几个问题,但不知何故,完成处理程序对其他答案的工作方式不同。此外,这些答案来自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?消息进行编译。

所以我的问题是:

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

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

  3. 如果没有完成处理程序,该方法只会在网络调用完成之前返回一个空值,如预期的那样。

    感谢。

1 个答案:

答案 0 :(得分:0)

在您当前的函数定义中,completionHandler的类型是可选的String,它不是函数。如果希望completionHandler成为数据任务完成时调用的函数,请将函数定义更改为func getConfigurationLink(completionHandler: String? -> ())。所以这里completionHandler是一个将可选String作为参数的函数。

您可以阅读如何将函数作为另一个函数的参数类型传递(这是您在此尝试做的事情,您将completionHandler函数传递给{ {1}}然后在网络请求完成时调用getConfigurationLinkhttps://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