我试图从网页抓取源代码来解析它并将信息放入数组中。请求很好,而html的源代码是我想要的字符串。问题是,在此功能之后,即使html和sbcc是全局的,我添加的值也会消失。即使是"测试"在解析功能中不会出现。我认为它与异步请求有关?我已经搜索过了,但它只带给我一些我不太了解的想法,或者并没有真正涵盖我的具体问题。我的代码片段在下面,如果有人可以提供帮助,我会非常感激。
let url = NSURL(string: "http://www.google.com");
var html = String()
var sbcc = courselisting();
func getSource(url: NSURL){
let request = NSURLRequest(URL: url)
NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue()) {
(response, data, error) in
if (error != nil) {
println("whoops, something went wrong")
let alert : UIAlertView = UIAlertView(title: "Oops!", message: "Something went wrong", delegate: nil, cancelButtonTitle: "Reload")
alert.show()
} else {
//println(self.html)
self.html = NSString(data: data, encoding: NSUTF8StringEncoding)!
self.parse()
}
}
}
func parse() {
sbcc.subjects.append("Test")
sbcc.subjects.append(html.substringToIndex(advance(html.startIndex, 2)))
println(self.html)
}
编辑:按照zisoft的建议,我删除了在上面的代码中将html字符串传递给parse()
,但是我的全局字符串html仍然没有附加值。有关详细信息,请参阅viewDidLoad
的主要部分
getSource(url!);
println(self.html)
它在viewDidLoad
中打印为空白,但解析内的println打印出正确的HTML。
答案 0 :(得分:1)
参数按值传递给函数。所以你要附加html
的副本。
由于您在全局范围内声明了html
,因此无需将其传递给函数:
{
...
self.parse()
}
func parse() {
sbcc.subjects.append("Test")
sbcc.subjects.append(html.substringToIndex(advance(html.startIndex, 2)))
println(self.html)
}
答案 1 :(得分:1)
我已经解决了!使用Rob的回答here。基本上我需要在异步调用中进行所有异步活动,并在完成时刷新所有内容。