如何将NSXMLParser抽象为单独的类-Swift

时间:2015-11-09 14:16:03

标签: ios swift nsxmlparser

使用NSXMLParser很简单,但我发现的所有示例都将解析代码放在ViewController中并直接更新UI。我想将解析抽象为一个单独的模型类,并从该类调用一个函数,以便在我的VC中获得它的结果。我无法弄清楚如何传递使用newForecastsArray结果更新的Parser?现在我只是传递一个空的array

class WeatherForecast: NSObject, NSXMLParserDelegate {

    var parser = NSXMLParser()
    var elements = NSMutableDictionary()
    var element = NSString()
    var textForecasts = [String]()
    var location = NSMutableString()
    var layoutKeys = [String]()
    var layoutKey = NSMutableString()
    var conditionsIcons = [String]()
     var newForecastArray = NSMutableArray()


    func getForecasts(lat: String, lon: String,  completionHandler: (result: NSMutableArray) -> Void)  {

        let baseURL = "http://forecast.weather.gov/MapClick.php?lat="
        let suffixURL = "&unit=0&lg=english&FcstType=dwml"

        let url = baseURL + lat + "&lon=" + lon + suffixURL

        newForecastArray = []
        parser = NSXMLParser(contentsOfURL:(NSURL(string: url))!)!
        parser.delegate = self
        parser.parse()

        completionHandler(result: newForecastArray)  //I NEED TO PASS the updated newForecastArray here
    }

    //XMLParser Methods

所以在我的VC中我试着打电话:

weatherForecast.getForecasts(lat, lon: lon) { (result) -> Void in
            print(result) 
        }

1 个答案:

答案 0 :(得分:2)

您应该创建一个var,这样您就可以存储completionHandler,而不是在getForecasts期间调用它。然后,当XML解析完成后,您可以使用实际结果调用completionHandler

请注意,如果您多次使用WeatherForecast的同一个实例,则会遇到缺少回调的问题。