我是swift的新手,本周我遇到了一个问题,这个问题已经让我拔掉了我的头发!所发生的事情如下,在我的应用程序中划分了几个类,让我的代码更多"清洁"在这个浪潮中,我决定将一些函数划分为项目的类,但到目前为止一直很好。
问题是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& #39;函数永远不会执行,因此永远不会返回有效值
如何赋予优先级以便我的代码仅在执行此功能后才能执行?
如何处理Swift中的DispatchQueue?
现在,感激不尽!
答案 0 :(得分:0)
您可以在此处查看如何使用DispatchQueue: How do I write dispatch_after GCD in Swift 3?
但最好重写FadbaWS.buscaAluno()以传入一个处理程序,它可以在准备就绪时执行,请参阅:How could I create a function with a completion handler in Swift?
答案 1 :(得分:0)
FadbaWS.buscaAluno
在哪个线程上运行?有完成处理程序吗?
您提到FadbaWS.buscaAluno
在函数结束时实现。这可能意味着它将在mainQueue上异步运行。如果是这种情况,那么您可以通过在主队列上异步调度它们来执行其他任务。
DispatchQueue.main.async {
if dadosAlunoWS.sucesso && dadosAlunoWS.usuarioEncontrado{
print(dadosAlunoWS.name)
}else{
//Error on request
}
}
这将起作用,因为mainQueue本质上是一个串行队列,在这里我们在主队列上串行分配任务。虽然这可以工作但是如果你可以在FadbaWS.buscaAluno
方法上实现完成处理程序会更好。
答案 2 :(得分:0)
使用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)
}
}