Ios 如何在Swift中使用dispatch_async?
我想向服务器发送一些数据,但当我尝试时,出现了此错误 我认为调度有问题,可能我没有正确使用它,但我没有xcode或swift的经验,所以我不知道如何很好地理解日志错误窗口,欢迎任何帮助,谢谢 这是我的代码:Ios 如何在Swift中使用dispatch_async?,ios,swift,swift2,Ios,Swift,Swift2,我想向服务器发送一些数据,但当我尝试时,出现了此错误 我认为调度有问题,可能我没有正确使用它,但我没有xcode或swift的经验,所以我不知道如何很好地理解日志错误窗口,欢迎任何帮助,谢谢 这是我的代码: func updateAndDismiss6() { SharingManager.sharedInstance.FinalDiag = self.Diag.text! SharingManager.sharedInstance.TreatmentDays = self.T
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=pruebafromios@pruebafromios.com®istro=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()
}
}
错误消息告诉您它试图从后台线程更新UI(在本例中为自动布局约束)。堆栈跟踪中存在大量
UIAlertView
和UIAlertController
引用,这说明问题的根源是UIAlertView
总之,所有UI更新都必须调度到主队列。因此,除了将performsguewithidentifier
分派到主队列之外,还必须将UIAlertView
/UIAlertController
分派到主队列
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)
}
}
您在执行segue时正在执行此操作。在显示警报时尝试相同的操作 不相关,但我建议不要在这种情况下使用
无主self
。如果视图控制器真的可以被解除,您应该使用弱self
。但是无主
会给您留下一个悬而未决的参考。另外,我建议不要使用UIAlertView
。现在你会使用UIAlertController
。关于你的JSON请求失败的原因,我建议你打印postString
,并确保(a)这些变量都不是需要展开的可选变量;(b)没有任何未保留的字符(例如标点、空格等)。当您编写x-www-form-urlencoded
请求时,通常会对值进行百分比转义,这只是为了安全起见。thx for ur advice pal