我一直在努力了解回调在 Swift 中的工作原理。我已经看过很多示例 ( like this one ),它们帮助我更好地理解回调,但我没有运气正确地实现一个回调。
我有一个接受 URL 的函数,从 Web API 下载一些 XML 数据,然后将其解析为对象。同时,我有一个 UILabel 正在等待来自 XML 请求的一些数据。
下面是我想设置回调函数的部分示例。为了清楚起见,假设它只返回一个数据点,稍后将分配给 UILabel:
XMLUtility.swift
// global
var weekForecasts = [DayForecast]()
class XMLUtility {
func retrieveDataFromXML(myUrl: String) {
if let url = NSURL(string: myUrl) {
if let data = NSData(contentsOfURL: url) {
var error: NSError?
var cleanedData = filterData(data)
if let doc = AEXMLDocument(xmlData: cleanedData, error: &error) {
//... does some work parsing xml ////
for day in date {
//... some work assigning values /////
weekForecasts.append(thisDay)
}
}
}
}
问题出现在我的 ViewController 中...我有一些 UILabel 正在等待来自 XML 数据请求的值。加载 ViewController 时,XML 尚未处理,标签无法接收值。
这是我在 ViewController 中所做的一个简化示例:
ViewController.swift
@IBOutlet weak var currentTemperatureLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
currentTemperatureLabel.text = // I get a value out of my [DayForecasts]
}
我理解为什么会这样,对于如何解决这个问题,我是新手理解。我相信我需要使用回调,但是根据我目前看到的示例,我不确定如何实现回调。
我的问题:
根据提供的示例,我如何将我的 retrieveDataFromXML
方法转换为回调。此外,我如何从我的 ViewController 调用函数来访问数据。
如有任何帮助,我们将不胜感激!
最佳答案
func retrieveDataFromXML(myUrl: String, completion: ((Array<DayForecast>) -> Void)) {
if let url = NSURL(string: myUrl) {
if let data = NSData(contentsOfURL: url) {
var error: NSError?
var cleanedData = filterData(data)
var weekForecasts = [DayForecast]() //local variable
if let doc = AEXMLDocument(xmlData: cleanedData, error: &error) {
//... does some work creating objects from xml
for day in date {
//... some work assigning values /////
weekForecasts.append(thisDay)
}
//pass the local array into the completion block, which takes
//Array<DayForecast> as its parameter
completion(weekForecasts)
}
}
}
}
像这样叫
//in this example it is called in viewDidLoad
func viewDidLoad() {
var urlString = "urlstring"
retrieveDataFromXML(urlString, {(result) -> Void in
//result is weekForecasts
//UI elements can only be updated on the main thread, so get the main
//thread and update the UI element on that thread
dispatch_async(dispatch_get_main_queue(), {
self.currentTemperatureLabel.text = result[0] //or whatever index you want
return
})
})
}
这是您要问的问题吗?
关于ios - 我将如何围绕 XML 请求创建回调?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29871633/