异步请求未正确更新变量

时间:2014-11-18 01:23:43

标签: ios iphone swift

我试图从网页抓取源代码来解析它并将信息放入数组中。请求很好,而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。

2 个答案:

答案 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。基本上我需要在异步调用中进行所有异步活动,并在完成时刷新所有内容。