强制执行顺序 - Swift3 / Xcode8 - 线程

时间:2017-02-08 11:45:27

标签: ios swift xcode multithreading queue

我是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?
现在,感激不尽!

3 个答案:

答案 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)

      }
    }