2016-11-09 3 views
1

Я хочу performe в SEGUE после отправки запроса на запись с помощью URLSession.shared.dataTaskВызов performSegue после URLSession.shared.dataTask

ViewController:

@IBAction func Connection(_ sender: AnyObject) { 
    let loginFunc = Login() 
    loginFunc.login(username: username.text!, password: password.text!) { jsonString in 
     let response = jsonString 
     print(response) 
     if response.range(of: "failure") == nil { 
      self.performSegue(withIdentifier: "home", sender: nil) 
     } 
    } 
} 

Логин:

class Login { 
// the completion closure signature is (String) ->() 
func login(username: String, password: String, completion: @escaping (String) ->()) { 
    var request = URLRequest(url: URL(string: "http://myurl/web/app_dev.php/login_check")!) 
    request.httpMethod = "POST" 
    let postString = "_username=" + username + "&_password=" + password 
    request.httpBody = postString.data(using: .utf8) 
    var responseString = "" 
    let task = URLSession.shared.dataTask(with: request) { data, response, error in 
     guard let data = data, error == nil else {             // check for fundamental networking error 
      print("error=\(error)") 
      return 
     } 

     if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200 {   // check for http errors 
      print("statusCode should be 200, but is \(httpStatus.statusCode)") 
      print("response = \(response)") 
     } 

      responseString = String(data: data, encoding: .utf8)! 
      completion(responseString) 
     } 
     task.resume() 
    } 
} 

Иногда это происходит с ошибкой Ошибка:

Нагрузочное приложение из-за неперехваченное исключение 'NSInternalInconsistencyException', причина: '- [UIKeyboardTaskQueue waitUntilAllTasksAreFinished] может быть вызван только из основного потока.

Есть ли лучший способ сделать это?

+1

Попробуйте диспетчерская свой 'performSegue 'обратно в главную очередь. –

ответ

2

Попытка этот путь:

if response.range(of: "failure") == nil { 
      NSOperationQueue.mainQueue().addOperationWithBlock { 
       self.performSegue(withIdentifier: "home", sender: nil) 
      } 
     } 

swift3:

if response.range(of: "failure") == nil { 
      OperationQueue.main.addOperation { 
       self.performSegue(withIdentifier: "home", sender: nil) 
      } 
} 
+0

Он работает отлично! Если я хорошо понял, что OperationQueue ожидает, что запрос будет выполнен раньше, чтобы выполнить Sergue? – ZeenaZeek

+0

да! операция остается в этой очереди до тех пор, пока она не будет явно отменена или не завершит выполнение своей задачи –

1

Как ошибка говорит вам нужно позвонить выполнить SEGUE в главном потоке, как этот

DispatchQueue.main.async { 
    self.performSegue(withIdentifier: "home", sender: nil) 
} 
Смежные вопросы