【问题标题】:Swift: How to call functions where one of the arguments is a completionHandlerSwift:如何调用其中一个参数是完成处理程序的函数
【发布时间】:2015-09-03 18:55:13
【问题描述】:

我对 XCode 和 Swift 很陌生,在我的 iOS 应用程序中,我编写了一个方法来执行对服务器上 php 文件的 POST 请求,方法是遵循 stackoverflow 中的一些答案 here

func closeTaskService(id_task:Int, completionHandler: (response: NSString) -> ()) {

    let request = NSMutableURLRequest(URL: NSURL(string: Settings.webServerGetUserTasks)!)
    request.HTTPMethod = "POST"
    let postParams = "action=close&id_task=\(id_task)"
    request.HTTPBody = postParams.dataUsingEncoding(NSUTF8StringEncoding)

    let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {
        data, response, error in

        println("response = \(response)")
        let responseString = NSString(data: data, encoding: NSUTF8StringEncoding)
        println("responseString = \(responseString!)")

        completionHandler(response: responseString!)

    }
    task.resume()
}

在哪里

webServerGetUserTasks = "http://localhost:8888/excogitoweb/mobile/handleTasks.php"

问题是我不知道如何在我的视图控制器类上调用该函数。我见过的例子在函数中没有参数,所以当它被调用时,他们只是写了闭包。这是我到目前为止尝试过的:

self.taskService.closeTaskService(self.taskCollection[indexPath.row].id), {(response: NSString) -> () in
        println("response = \(response)")})

但是 XCode 显示很多错误,它建议我添加 ';'在两三个地方...请您解释一下如何调用这种函数以及如何编写闭包?

【问题讨论】:

    标签: ios xcode swift closures completionhandler


    【解决方案1】:

    我猜是一个简单的拼写错误。当我使用完成处理程序调用函数时,我总是让自动完成来完成它的工作,然后双击周围有一个圆角框的东西。这总是给出正确的语法。

    self.taskService.closeTaskService(self.taskCollection[indexPath.row].id) { (response) -> () in
        print(response)
    }
    

    【讨论】:

    • 也谢谢你。毕竟这很简单......它有效:)
    【解决方案2】:

    试试这个

    func closeTaskService(id_task:Int, completionHandler: (response: NSString) -> ()) {
        let request = NSMutableURLRequest(URL: NSURL(string: "http://myserverip/myfile.php")!)
        request.HTTPMethod = "POST"
        let postParams = "action=close&id_task=\(id_task)"
        request.HTTPBody = postParams.dataUsingEncoding(NSUTF8StringEncoding)
        let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {
            data, response, error in
            println("response = \(response)")
            let responseString = NSString(data: data, encoding: NSUTF8StringEncoding)
            println("responseString = \(responseString!)")
            completionHandler(response: responseString!)
        }
        task.resume()
    }
    

    然后像这样调用你的方法

    self.closeTaskService(12, completionHandler: { (response) -> () in
        //handle response
    })
    

    【讨论】:

      【解决方案3】:

      试试这个

      self.taskService.closeTaskService(self.taskCollection[indexPath.row].id), completionHandler: {(response: NSString) -> () in
                  println("response = \(response)")
      })
      

      【讨论】:

        【解决方案4】:

        首先要了解闭包表达式语法是如何定义的,根据Apple闭包表达式语法有如下一般形式:

        { (parameters) -> return type in
            statements
        }
        

        根据Apple

        如果您需要将闭包表达式作为函数的最终参数传递给函数并且闭包表达式很长,则将其写为 trailing closure 会很有用。尾随闭包是写在它支持的函数调用的括号之外(和之后)的闭包表达式:

        func someFunctionThatTakesAClosure(closure: () -> Void) {
            // function body goes here
        }
        
        // here's how you call this function without using a trailing closure:
        
        someFunctionThatTakesAClosure({
            // closure's body goes here
        })
        
        // here's how you call this function with a trailing closure instead:
        
        someFunctionThatTakesAClosure() {
            // trailing closure's body goes here
        }
        

        然后,我认为通过上面的答案和这个答案,您可以更好地理解闭包的工作原理以及如何调用它。不过,我强烈建议您阅读 Apple 书籍的 Closures 章节,以深入了解它的工作原理。

        希望对你有所帮助。

        【讨论】:

        • 谢谢,肯定有帮助。现在它更清楚了......问题是我正在开发我的第一个 iOS 应用程序,而我还在学习 Swift 和 iOS 等等......我迷失在这些小事情中......
        猜你喜欢
        • 2021-04-05
        • 1970-01-01
        • 2014-10-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多