我已经完成了一些阅读并且在类似的帖子中有推荐(Swift closure with Alamofire)并试图对我的代码做同样的事情,但我现在找不到调用该函数的方法?
我收到错误:无法将表达式的类型'(response:@lvalue String)'转换为'((response: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
}
}
谢谢!
科斯塔斯
答案 0 :(得分:2)
根据您对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
的camelCase约定。)