如何将 NSXMLParser 抽象成单独的 class -Swift

How to abstract NSXMLParser into separate class -Swift

使用 NSXMLParser 很简单,但我找到的所有示例都将解析代码放在 ViewController 中并直接更新 UI。我想将解析抽象为一个单独的模型 class 并从该 class 调用一个函数以在我的 VC 中获得它的结果。我不知道如何传递用 Parser 结果更新的 newForecastsArray?现在我只是传递一个空的 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) 
        }

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

请注意,如果您多次使用 WeatherForecast 的同一个实例,您将遇到回调丢失的问题。