2016-08-11 3 views
2

Ich mag einige Daten an den Server senden, aber wenn ich versuche, erhalte ich diese StörungWie verwendet man dispatch_async in Swift?

enter image description here

Ich denke, ein Problem mit der Absendung ist vielleicht richtig verwende ich es nicht, aber ich habe keine Erfahrung mit Xcode oder schnell, so weiß ich nicht, wie gut das Protokoll Fehlerfenster zu verstehen, ist jede Hilfe willkommen, thaks für ur Zeit

Dies ist mein Code:

func updateAndDismiss6() { 
    SharingManager.sharedInstance.FinalDiag = self.Diag.text! 
    SharingManager.sharedInstance.TreatmentDays = self.Trata.text! 
    SharingManager.sharedInstance.SystematicTreat = self.TrataSu.text! 
    SharingManager.sharedInstance.LidoPatch = self.ParcheLido.text! 
} 

@IBAction func IrResumen(sender: AnyObject) { 

    updateAndDismiss6() 

    let prefs = NSUserDefaults.standardUserDefaults() 
    let userid = prefs.stringForKey("userid")! as String 

    let Inicial = SharingManager.sharedInstance.Initials 
    let Edad = SharingManager.sharedInstance.Age 
    let Resultados = SharingManager.sharedInstance.Result 
    let Diagnostico = SharingManager.sharedInstance.FinalDiag 
    let Ttratamiento = SharingManager.sharedInstance.TreatmentDays 
    let TsUsado = SharingManager.sharedInstance.SystematicTreat 
    let Plidocaina = SharingManager.sharedInstance.LidoPatch 




    if (Inicial == "" || Edad == "" || Resultados == "" || Diagnostico == "" || Ttratamiento == "" || TsUsado == "" || Plidocaina == "" || userid == "") { 

     let alertView:UIAlertView = UIAlertView() 
     alertView.title = "No data" 
     alertView.message = "error de datos" 
     alertView.delegate = self 
     alertView.addButtonWithTitle("OK") 
     alertView.show() 
    } 
    else { 



     let url_servicio = "http://arasoftltda.com/grunenthal/app/muestra.php" 

     let request = NSMutableURLRequest(URL: NSURL(string: url_servicio)!) 
     request.HTTPMethod = "POST" 
     //let postString = "nombre=pruebafromios&[email protected]&registro=registro&esp=esp&pais=Colombia&ciudad=Cogua&contrasena=123" 
     let postString = "iniciales=\(Inicial)&edad=\(Edad)&resultado=\(Resultados)&diagnostico=\(Diagnostico)&dias=\(Ttratamiento)&tratamiento=\(TsUsado)&parche=\(Plidocaina)&id=\(userid)" 
     request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding) 
     let task = NSURLSession.sharedSession().dataTaskWithRequest(request) { data, response, error -> Void in 
      if (error != nil){ 
      print(error!.localizedDescription) 
      } else{ 
       let nsdata:NSData = NSData(data: data!) 

       do{ 
        let json = try NSJSONSerialization.JSONObjectWithData(nsdata, options: NSJSONReadingOptions.MutableContainers) 
        let id = json["id"] as! String 



        if (id != ""){ 
         print (id) 

         dispatch_async(dispatch_get_main_queue()) { 
          [unowned self] in 
          self.performSegueWithIdentifier("Resumen", sender: self)} 
        } 

       } 

       catch{ 
        print("Error del JSON") 
        let alertView:UIAlertView = UIAlertView() 
        alertView.title = "Fallo al enviar datos!" 
        alertView.message = "Error de conexion con el servidor" 
        alertView.delegate = self 
        alertView.addButtonWithTitle("OK") 
        alertView.show() 
       } 
       } 

     } 
     task.resume() 

    } 

    } 
+1

Nicht verwandt, aber ich würde in diesem Zusammenhang von der Verwendung von "unowned self" abraten. Wenn der View-Controller wirklich gelöscht werden könnte, würden Sie 'weak self' verwenden. Aber "unowned" kann dich mit einer baumelnden Referenz verlassen. Außerdem würde ich davon abraten, 'UIAlertView' zu verwenden. Heutzutage würden Sie 'UIAlertController' verwenden. – Rob

+0

In Bezug darauf, warum Ihre JSON-Anfrage fehlschlägt, würde ich vorschlagen, dass Sie den 'postString' drucken und sicherstellen (a), dass keine dieser Variablen Optionals waren, die entpackt werden mussten; und (b) dass es keine nicht reservierten Zeichen (z. B. Interpunktion, Leerzeichen usw.) gab. Wenn Sie eine 'x-www-form-urlencoded'-Anfrage verfassen, würden Sie im Allgemeinen prozentual den Werten entkommen, nur um sicher zu sein. – Rob

+0

thx für ur beraten pal –

Antwort

2

Ihre Fehlermeldung sagt y ou dass es versucht hat, die Benutzeroberfläche (in diesem Fall die automatischen Layouteinschränkungen) von einem Hintergrundthread zu aktualisieren. Das Vorhandensein zahlreicher UIAlertView und UIAlertController Verweise in der Stapelüberwachung weist Sie darauf hin, dass die Quelle des Problems die UIAlertView ist.

Unter dem Strich müssen alle UI-Updates an die Hauptwarteschlange gesendet werden. Sie müssen also nicht nur performSegueWithIdentifier an die Hauptwarteschlange senden, sondern auch Ihre UIAlertView/UIAlertController an die Hauptwarteschlange senden.

+1

das ist richtig, danke –

1
func showError() { 
     dispatch_async(dispatch_get_main_queue()) { [unowned self] in 
      let ac = UIAlertController(title: "Loading error", message: "There was a problem loading the feed; please check your connection and try again.", preferredStyle: .Alert) 
      ac.addAction(UIAlertAction(title: "OK", style: .Default, handler: nil)) 
      self.presentViewController(ac, animated: true, completion: nil) 
     } 
    } 

Sie tun es, während Sie segue durchführen. Versuchen Sie dasselbe, während Sie Warnungen anzeigen !!

Verwandte Themen