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

标签 ios swift xml-parsing callback

我一直在努力了解回调在 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/

相关文章:

android - 是否有(有点高级的)C++ 库来创建在 iOS 和 Android 上运行的 pdf 文档?

iphone - 如何检测用户使用 GLPin 绘制的字母...iPhone

java - 如何在 XML 解析器抛出 MalformedByteSequenceException 后定位错误

Swift:将任何对象转换为 Int64 = nil

swift - 在我的例子中如何检查两个参数的条件

android - 在android中解析XML?

unicode - XML 和 Unicode 规范 : what’s a legal character?

ios - 无法设置视频录制的最长持续时间?

IOS - 未调用 Facebook SDK fbDidLogin - 初始化 View Controller 。

swift - 添加新值时 Firebase 数据会闪烁