2017-12-07 13 views
2

私はすぐに新しく、このプロジェクトに取り掛かりました。これはiosのログインアプリです。 「ログイン」ボタンのコードは次のとおりです。 「パロラ」とは、途中で「パスワード」を意味します。Xcode、swift:SIGABRT error on performsegue

@IBAction func loginButton(_ sender: Any) { 
    let Email = emailText.text; 
    let Parola = parolaText.text; 

    if((Email?.isEmpty)! || (Parola?.isEmpty)!){ 
     print("Empty field!") 
    } else { 

    let myUrl = NSURL(string: "http://my.url/webservice.php"); 
    let request = NSMutableURLRequest(url:myUrl! as URL); 
    request.httpMethod = "POST"; 

    let postString = "email=\(String(describing: Email!))&password=\(String(describing: Parola!))"; 
    request.httpBody = postString.data(using: String.Encoding.utf8); 


    let task = URLSession.shared.dataTask(with: request as URLRequest){ 
     data, response, error in 

     if error != nil { 
      print("error=\(String(describing: error))") 
      return 
     } 

     var err: NSError? 
     do { 
      let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? NSDictionary 

      if let parseJSON = json { 
       var resultValue:String = parseJSON["status"] as! String; 
       print("result: \(resultValue)"); 

       if(resultValue == "Success"){ 
        self.performSegue(withIdentifier: "LogPers", sender: nil) 
       } 
      } 

     } catch let error as NSError { 
      err = error 
     } 
    } 

    task.resume() 

} 
} 

入力されたユーザー情報を確認するためにWebサービスを使用して外部データベースに接続します。そのすべてがうまく動作します。

私の問題は、アプリケーションがセグを実行しようとするとSIGABRTエラーが発生します。この問題をオンラインで検索しようとしたところ、このエラーはバグのあるアウトレットと接続によって発生していると言われましたが、私の店舗はすべて問題ありません。

「let task = URLSession.shared.dataTask(with:URLRequestとしてリクエスト){」構造の外でSegueを取ると、SIGABRTエラーなしで実行できますが、内部でそれを必要とするので、ユーザー入力が正しい場合にのみ表示されます。

どうすれば修正できますか?前もって感謝します。

私はxcodeの初心者であり、すみません、これはばかな質問であれば申し訳ありません。

答えて

2

クラッシュは、バックグラウンドスレッドでセグを実行しようとしているためです(performSegueコールがURLSessionコールバックにあるため)。 needsというビューを持つスレッドをメインスレッド上で実行するコード。

このように、DispatchQueueブロックであなたのperformSegue呼び出しをラップしてみてください。

DispatchQueue.main.async { 
    self.performSegue(withIdentifier: "LogPers", sender: nil) 
}