2016-03-15 50 views
0

我是新來迅速的編程語言,我試圖用NSXMLParserDelegate解析從soap Web服務連接的xml,連接可以正常使用:如何UITableViewController中首先執行解析器委託斯威夫特

struct Datos { 
     let nombre:String 
     let numero:String 
    } 

    var data = [Supervisor_Agencia]() 

    override func viewDidLoad() { 

     print("viewload")   

     var soapMessage = "...The xml message..." 

     var urlString = "...The web service url..." 
     var url = NSURL(string: urlString) 
     var request = NSMutableURLRequest(URL: url!) 

     request.HTTPMethod = "POST" 
     request.HTTPBody = soapMessage.dataUsingEncoding(NSUTF8StringEncoding) 
     request.addValue("...The Host...", forHTTPHeaderField: "Host") 
     request.addValue("text/xml; charset=utf-8", forHTTPHeaderField: "Content-Type") 
     request.addValue(String(soapMessage.characters.count), forHTTPHeaderField: "Content-Length") 
     request.addValue("...The SOAP Action...", forHTTPHeaderField: "SOAPAction") 

     var connection = NSURLConnection(request: request, delegate: self, startImmediately: true) 
     connection!.start() 
     if (connection == true) { 
      var mutableData : Void = NSMutableData.initialize() 
     } 
    } 

解析器代表,它的工作並分析信息:

func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String]) {/*The code*/} 
func parser(parser: NSXMLParser, foundCharacters string: String) {/*The code*/} 
func parser(parser: NSXMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) { 
print("parser") 
cont = cont + 1 
data.append(Supervisor_Agencia(nombre: descripcion, numero: resultado))} 

的問題是,當我試圖使用數組「數據」,使我認識到,函數解析執行最後的細胞,AF之三的方法的tableView,所以我不能使用數組,因爲它`尚未填寫:

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    print("cont") 
    return cont 
} 


override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    print("cells") 
    let cell = tableView.dequeueReusableCellWithIdentifier("celda", forIndexPath: indexPath) as UITableViewCell 

    var dat : Supervisor_Agencia 

    dat = data[indexPath.row] 

    cell.textLabel?.text = dat.nombre 

    return cell 
} 

我知道這是因爲「打印」的輸出順序是這樣的:

1.viewload 2。續3.cells 4.parser

,我需要的順序是這樣的:

1.viewload 2.parser 3.cont 4.cells

誰能告訴我怎樣才能做到這一點?

回答

0

您遇到的問題是Web請求在您確定的時間不會回來。一旦parser函數返回結果,請致電self.tableView.reloadData(),然後它將正確使用data填寫tableView,根據需要調用所有代表。

在這之前,最容易做的事情是創建一個data佔位符是一個空數組,然後將返回0行和段(因此你不會有數量擔心cellForRowAtIndexPath爲它不會被稱爲。

+0

謝謝,它完美的工作:D –