我将如何围绕 XML 请求创建回调?

How would I create a callback around an XML request?

我一直在努力了解回调在 Swift 中的工作原理。我已经看过很多例子 (like this one),它们帮助我更好地理解回调,但我没有运气正确地实现一个回调。

我有一个接受 URL 的函数,从网络 api 下载一些 XML 数据,然后将其解析为对象。同时我有一个 UILabel 正在等待来自 XML 请求的一些数据。

下面是我想设置回调函数的部分示例。为了清楚起见,假设它只有 returns 一个数据点,稍后将分配给 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
        })
    })
}

这就是您要问的问题吗?