2015-12-07 1 views
0

Я работаю над приложением, которое должно запрашивать некоторые данные с моего сервера. Я использую 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 не работает.

ответ

0

Убедитесь, что код в вашем запросеXmlИнформация закрытия вызывается в основном потоке. Вы не должны обновлять пользовательский интерфейс в фоновом потоке.

shipment.requestXmlInformation {() ->() in 
    dispatch_async(dispatch_get_main_queue(), {() -> Void in 
     self.updateUi() 
     print(self.statusLbl.text) 
    }) 
} 

Кроме того, вы, похоже, не вызывать полное закрытие в любом месте вашего метода requestXmlInformation

+0

Я думаю, что последняя часть, скорее всего, будет проблема, чем первый, хотя документация Alamofire не очень явно указано, вызван ли обработчик завершения в основном потоке или в фоновом потоке. – jcaron

+0

@jcaron Я согласен. Последняя проблема, безусловно, является реальной проблемой. Не имеет значения, на какой поток вызывается закрытие, если оно вообще никогда не вызывается ... :) – andlin

+0

Спасибо @andlin. Теперь я понял, что я не закончил закрытие. Я должен добавить complete() в мою requestXmlInformation функцию после Alamofire.request. Теперь это работает! – amanbolat

 Смежные вопросы

  • Нет связанных вопросов^_^