快速函数完成

Posted

技术标签:

【中文标题】快速函数完成【英文标题】:Swift function completion 【发布时间】:2014-11-23 16:54:05 【问题描述】:

我已经阅读了一些内容,并且在类似的帖子 (Swift closure with Alamofire) 中提出了建议,并尝试对我的代码执行相同的操作,但我现在找不到调用该函数的方法?

我得到一个错误:无法将表达式的类型“(响应:@lvalue String)”转换为类型“((响应:字符串)->())->()”

import UIKit

class myClass101: UIViewController 

override func viewDidLoad() 
    super.viewDidLoad()
    // Do any additional setup after loading the view.
    var api_error: String = ""

    activityInd.startAnimating()

    call_api_function(response: api_error)

    activityInd.stopAnimating()

    if (api_error != "") 
        let alertController = UIAlertController(title: "Server Alert", message: "Could not connect to API!", preferredStyle: UIAlertControllerStyle.Alert)
        alertController.addAction(UIAlertAction(title: "Dismiss", style: UIAlertActionStyle.Default,handler: nil))
        self.presentViewController(alertController, animated: true, completion: nil)
    
  

函数如下:

func call_api_function(completion: (response: String) -> ()) 

    let api_url_path: String = "http://\(str_api_server_ip):\(str_api_server_port)"
    let api_url = NSURL(string: api_url_path + "/devices.xml")!

    Alamofire.request(.GET, api_url)
        .authenticate(user: str_api_username, password: str_api_password)
        .validate(statusCode: 200..<300)
        .response  (request, response, data, error) in

            var senderror: String = error!.localizedDescription
            completion(response: senderror )

            if (error != nil) 

                println(senderror)
            

            // do other tasks here

    


谢谢!

科斯塔斯

【问题讨论】:

【参考方案1】:

鉴于您对call_api_function 的定义,您可以这样称呼它:

call_api_function()  response in

    activityInd.stopAnimating()

    // now use `response` here

我建议您对 The Swift Programming Language: Closures 中的尾随闭包进行一些研究。


但是,话虽如此,您的call_api_function 也有自己的问题。

您正在对 error 可选选项进行强制解包。如果没有错误怎么办?然后,nil 可选项的强制解包将失败,代码将崩溃。

如果请求成功,则您不会对返回的 data 执行任何操作。据推测,您提出请求是因为您想对返回的数据做一些事情。

不幸的是,您没有提供有关您期望的 XML 响应的性质的信息,但大概您会实例化一个 NSXMLParser 实例来解析它,然后实现 NSXMLParserDelegate 方法并调用 parse方法。

跟进前面的观点,而不是一个带有单个非可选参数的闭包,我希望看到一个带有两个可选参数的闭包,一个带有解析数据的可选参数(如果请求和解析成功)和一个带有NSError 的可选(只有在出现错误时才会设置)。

非常小的一点,但您可能希望采用 Cocoa 命名约定(例如 callApiFunction 的骆驼命名约定)。

【讨论】:

顺便说一下,the answer to your other question 显示了一个带有两个参数的闭包示例。显然,鉴于您正在处理 XML,您可能也想解析它,但另一个答案说明了通过闭包传递两个参数的想法。

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

如何将参数传递给快速完成的函数

如何正确等待函数快速完成?

发出调用快速完成处理程序关闭的问题

零基础快速掌握JavaScript函数简介及创建方式函数的本质与内部函数函数应用及闭包

快速掌握Lua 5.3 —— 调试库

异步请求积压可视化|如何 1 分钟内快速定位函数计算积压问题