Я работаю над приложением, которое должно запрашивать некоторые данные с моего сервера. Я использую Alamofire для этого, а затем использую SWXMLHash для анализа данных XML. Есть два контроллера просмотра, на первом я могу написать номер отправки, затем переопределить функцию prepareForSegue и отправить этот номер в следующий контроллер просмотра, который должен отображать данные с сервера и updateUI на viewDidLoad, но это не так. Где проблема?Быстрая пользовательская функция updateUI() не работает на viewDidLoad
Мой класс:
class Shipment {
private var _shipmentNumber: String!
private var _shipmentStatus: String!
private var _trackURL: String!
var shipmentNumber: String {
if _shipmentNumber == nil {
_shipmentNumber = ""
}
return _shipmentNumber
}
var shipmentStatus: String {
if _shipmentStatus == nil {
_shipmentStatus = ""
}
return _shipmentStatus
}
init(spNumber: String) {
self._shipmentNumber = spNumber
_trackURL = "..."
}
func requestXmlInformation(completed: DownloadComplete) {
let url = NSURL(string: _trackURL)!
Alamofire.request(.GET, url).responseData { response in
if let xmlToParse = response.data as NSData! {
let xml = SWXMLHash.parse(xmlToParse)
do {
let xmlSpWeight = try xml["fmresultset"]["resultset"]["record"]["field"].withAttr("name", "ТotalWeight")["data"].element!.text! as String
self._shipmentStatus = xmlSpStatus
print(self._shipmentStatus)
} catch let err as NSError {
print(err.debugDescription)
}
}
}
}
}
My Second View Controller
@IBOutlet weak var numberLbl: UILabel!
@IBOutlet weak var weightLbl: UILabel!
@IBOutlet weak var statusLbl: UILabel!
@IBOutlet weak var packageQtyLbl: UILabel!
var shipment: Shipment!
override func viewDidLoad() {
super.viewDidLoad()
shipment.requestXmlInformation {() ->() in
self.updateUi()
print(self.statusLbl.text)
}
}
функция updateUI:
func updateUi() {
numberLbl.text = shipment.shipmentNumber
weightLbl.text = shipment.shipmentWeight
statusLbl.text = shipment.shipmentStatus
packageQtyLbl.text = shipment.shipmentPackageQty
}
Он печатает данные в терминале, но я думаю, что функция updateUI не работает.
Я думаю, что последняя часть, скорее всего, будет проблема, чем первый, хотя документация Alamofire не очень явно указано, вызван ли обработчик завершения в основном потоке или в фоновом потоке. – jcaron
@jcaron Я согласен. Последняя проблема, безусловно, является реальной проблемой. Не имеет значения, на какой поток вызывается закрытие, если оно вообще никогда не вызывается ... :) – andlin
Спасибо @andlin. Теперь я понял, что я не закончил закрытие. Я должен добавить complete() в мою requestXmlInformation функцию после Alamofire.request. Теперь это работает! – amanbolat