2016-05-27 7 views
-1

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() 

} 



} 

は明らかに多くのコードがありますが、私はあなたに問題があるコードをもたらしました。

答えて

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

あなたが要求、応答の前に「構文解析を開始します」見ていると、データが印刷されていますか?

私はself.beginParsing()の呼び出しが完了ブロック内にある必要があると考えています。今のところ、HTTP要求が送信されるとすぐにbeginParsing()が呼び出されます。

https://github.com/Alamofire/Alamofire#response-handling

関連する問題