使用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)
}
答案 0 :(得分:2)
您应该创建一个var
,这样您就可以存储completionHandler
,而不是在getForecasts
期间调用它。然后,当XML解析完成后,您可以使用实际结果调用completionHandler
。
请注意,如果您多次使用WeatherForecast
的同一个实例,则会遇到缺少回调的问题。