快速完成处理程序

Posted

技术标签:

【中文标题】快速完成处理程序【英文标题】:Completion handler with swift 【发布时间】:2017-06-01 13:22:29 【问题描述】:

我目前正在学习 swift,并且从几个小时以来我一直在尝试理解错误。由于查询,我正在尝试从 php 脚本中获取 xml 文件,并且我正在使用完成处理程序来获取这些查询的结果作为回调。

问题是我对这些技术不满意,它说缺少论据。

这是使用完成处理程序的函数:

func connect(completion: (String) -> ())
    
    let password : String = "psw"
    let login : String = "log"
    let postString : String = "login=\(login)&password=\(password)"
    let urlString = "http://www.mydomain.fr/script.php"
    var output : String = ""
    let request = NSMutableURLRequest(url: NSURL(string: urlString)! as URL)
    request.httpMethod = "POST"
    request.httpBody = postString.data(using: String.Encoding.utf8)

    let task = URLSession.shared.dataTask(with: request as URLRequest)
        data, response, error in

        if error != nil 
            print("error=\(error)")
            return
        
        let responseString = NSString(data: data!, encoding: String.Encoding.utf8.rawValue)
        print("responseString = \(responseString)")
        output = responseString as! String
    
    task.resume()
    completion(output)

下面是我调用这个函数的一段代码:

    func misctest()

    let dbc : dataBaseCloner = dataBaseCloner()
    let output: String
    connect(completion :  (output) in
        print(output)
    )

这段代码显示了关于连接调用的错误:

>>>Missing argument for parameter #2 in call

我做错了什么?为什么要两个参数?

非常感谢您的帮助。

埃尔巴托

【问题讨论】:

这不会修复您的错误,但您必须将“完成(输出)”移至任务完成,因为它是异步的,否则您的输出将始终为空 【参考方案1】:

我已经复制粘贴了您的代码,它可以正常工作,没有任何错误。尝试关闭再打开 Xcode。

您还必须将 completion(output) 移动到您的任务完成中,因为它是异步的,否则您的输出将始终为空:

(...)
    let responseString = NSString(data: data!, encoding: String.Encoding.utf8.rawValue)
    print("responseString = \(responseString)")
    output = responseString as! String
    completion(output)
    
task.resume()
(...)

【讨论】:

不行,即使我更新了Xcode也不行。并开始犯更复杂的错误【参考方案2】:

这太奇怪了。我刚刚再次尝试,按照您的要求将完成放置在正确的位置,然后我重新启动了 Xcode,更新了它并重新启动了我的计算机,我仍然有这个错误:在调用中缺少参数 #2 的参数。这一次,如果我点击错误,它会向我提出一些建议,添加两个新参数,例如:

func misctest()

    let dbc : dataBaseCloner = dataBaseCloner()
    let output: String
    connect( (output) in
        print(output)
    , <#UnsafePointer<sockaddr>!#>, <#socklen_t#>)
    print("working!")

但它不起作用并告诉我:

cannot convert value of type '(Any)->()' to expected argument type'int32'

这太奇怪了。

【讨论】:

以上是关于快速完成处理程序的主要内容,如果未能解决你的问题,请参考以下文章

从另一个文件中快速调用完成处理程序失败

如何快速使用异步函数?完成处理程序[重复]

循环的快速完成处理程序将执行一次,而不是由于循环而执行10次

swift中属性的完成处理程序

使用完成处理程序进行异步调用的多个 URLSession dataTask 导致内存上升

XML快速写网页-02