gpt4 book ai didi

xml - 如何在 Swift 中首先在 UITableViewController 中执行解析器委托(delegate)

转载 作者:行者123 更新时间:2023-11-30 13:36:23 25 4
gpt4 key购买 nike

我是 swift 编程语言的新手,我正在尝试使用 NSXMLParserDelegatesoap Web 服务连接解析 xml,连接工作正常:

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

解析器委托(delegate)完成其工作并解析信息:

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

问题是,当我尝试使用数组“data”来创建单元格时,我意识到函数解析最后在方法 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.cont 3.cells 4.parser

我需要这样的顺序:

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

谁能告诉我如何实现这个目标?

最佳答案

您遇到的问题是网络请求不会在您可以确定的时间返回。一旦您的解析器函数返回结果,调用 self.tableView.reloadData() ,然后它将正确使用数据来填充您的 tableView,根据需要调用所有委托(delegate)。

在此之前,最简单的方法是创建一个空数组的 data 占位符,然后返回 0 来表示行数和节数(因此您不必担心 cellForRowAtIndexPath 因为它不会被调用。

关于xml - 如何在 Swift 中首先在 UITableViewController 中执行解析器委托(delegate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36022379/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com