![](/img/trans.png)
[英]Swift3 and Xcode8: Not able to perform segue after execution of a function
[英]Force execution order - Swift3/Xcode8 - Threads
我是新手,本周我遇到了一個問題,已經使我拔掉頭發了!
接下來發生的事情是,在我的應用程序中將其划分為幾個類,以使我的代碼更“干凈”。在這一波中,我決定按項目將一些函數划分為多個類,但到目前為止還不錯。
問題是Swift如何處理執行隊列,而留下了ViewController之外的所有內容,這阻礙了我。
我將向您展示一些代碼,以便您可以更好地擴展我在說的內容。
我的ViewController按鈕的功能:
@IBAction func btnLogin(_ sender: UIButton) {
//The line that the Swift "skips"
let dadosAlunoWS = FadbaWS.buscaAluno(matricula: MatriculaTbox.text!, senha: SenhaTbox.text!, token: "TOKEN")
//'dadosAlunoWS' aways empty because 'FadbaWS.buscaAluno'
//is only performed at the end of 'btnLogin'
if dadosAlunoWS.sucesso && dadosAlunoWS.usuarioEncontrado{
print(dadosAlunoWS.name)
}else{
//Error on request
}
}
我知道並行性和並發性的概念,並且通過研究,我能夠意識到對接口進行優先級排序是Swift的本機,這使一切變得流暢,但是我的問題是我的'FadbaWS.buscaAluno'函數從未執行過,因此永遠不會返回有效值。
如何賦予優先級,以便我的代碼僅在執行此功能后才能繼續執行?
如何在Swift中處理DispatchQueue?
現在,感激不盡!
您可以在此處查看如何使用DispatchQueue: 如何在Swift 3中編寫GCD的dispatch_after?
但是最好重寫FadbaWS.buscaAluno()來傳遞一個處理程序,該處理程序在就緒時可以執行,請參見: 如何在Swift中使用完成處理程序創建函數?
FadbaWS.buscaAluno
在哪個線程上運行? 有沒有完成處理程序?
您提到FadbaWS.buscaAluno
在函數結尾處實現。 這可能意味着它正在mainQueue上異步運行。 如果是這種情況,那么您可以通過在主隊列上異步調度其他任務來簡單地執行它們。
DispatchQueue.main.async {
if dadosAlunoWS.sucesso && dadosAlunoWS.usuarioEncontrado{
print(dadosAlunoWS.name)
}else{
//Error on request
}
}
這將起作用,因為mainQueue本質上是一個串行隊列,並且這里我們在主隊列上串行分配任務。 雖然可以,但是如果可以在FadbaWS.buscaAluno
方法上實現完成處理程序, FadbaWS.buscaAluno
更好了。
正如一些人在這里評論的那樣,使用CompletionHandler是解決方案
self.FadbaWS.buscaAluno(matricula: MatriculaTbox.text!, senha: SenhaTbox.text!, token: "TOKEN", complete:{ resultado in
if resultado.2 && resultado.3{
print(resultado.0)
}else
//Error on request
}
})
在這種情況下,我需要一些參數,所以我這樣做了。 它有效,但我不知道它是否正確
我的“ buscaAluno”功能:
func buscaAluno(matricula: String, senha: String, token: String, complete: @escaping (_ nome: String?, _ login: String?, _ sucesso:Bool, _ userok:Bool) -> Void) {
complete("Wender", "1234", true, true)
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.