-1

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

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

谢谢。

4

1 回答 1

0

在您当前的函数定义类型中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

还有一点关于completionHandlers的解释: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

于 2016-06-05T02:34:42.040 回答