在同一个类中访问它时,var inside class为空

时间:2016-05-27 20:41:59

标签: ios swift function class

我有一个类可以下载和解析一些xml数据。 当按下按钮时,我创建了一个类的实例并在该类中调用一个函数。

类中的函数将下载一些xml数据并将其分配给类中的变量。然后该函数将调用另一个函数来开始解析同一个类中的数据。但是当这个函数试图用xml数据解析变量时,它是空的。

我的问题是,当从同一类中的另一个函数访问变量时,为什么该变量为空?

ViewController:
@IBAction func searchFieldAction(sender: AnyObject) {
    let bibSearch: bibSok = bibSok()
    if let searchQ = searchfield.text {
        bibSearch.bookSearch(String(searchQ))
    }
}

这里没什么不对的^

class bibSok: NSObject, NSXMLParserDelegate {
    var xmlData:NSData = NSData()

    func bookSearch(let stringQuery: String){
    self.xmlData = NSData()
    let url = "urlToGetXMLdata"

    Alamofire.request(.GET, url!).validate().response { (request, response, data, error) in
        print(request) //url is looking good and everything is fine
        print(response) //Looking good. 200OK 
        print(error) //Nothing to see here
        print(data!) //Gives xml data. Everything is good
        self.xmlData = data!  //assign data to the variable. Great so far        
    }
    self.beginParsing()
}
 func beginParsing(){
    print("Begin parsing")
    print(self.xmlData) //Empty as f*$%. <>
    self.parser = NSXMLParser(data: self.xmlData) //Will not begin parse because it is empty
    self.parser.delegate = self
    self.parser.parse()

}



}

显然还有更多的代码,但是我给你带来了问题所在的代码。

2 个答案:

答案 0 :(得分:4)

Alamofire request方法必须是异步的。这意味着它会在数据可用之前立即返回。

使用带有这样的完成块的异步方法的想法是在请求完成后调用完成块。您需要将调用移至完成块内的beginParsing():

Alamofire.request(.GET, url!).validate().response { (request, response, data, error) in
    print(request) //url is looking good and everything is fine
    print(response) //Looking good. 200OK 
    print(error) //Nothing to see here
    print(data!) //Gives xml data. Everything is good
    self.xmlData = data!  //assign data to the variable. Great so far        
    self.beginParsing()
}

答案 1 :(得分:1)

你是否看到&#34;开始解析&#34;在打印请求,响应和数据之前?

我相信对self.beginParsing()的调用需要在完成块内。现在,只要提交了HTTP请求,就会调用beginParsing()。

请参阅https://github.com/Alamofire/Alamofire#response-handling