2017-02-08 5 views
0

Я новичок в быстрой работе, и на этой неделе я столкнулся с проблемой, которая уже заставляет меня сорвать мои волосы!
Что происходит, так это следующее, разделенное на мое приложение в нескольких классах, чтобы оставить мой код более «чистым», и в этой волне я решил разделить некоторые функции на классы по проекту, но пока все хорошо.
Проблема в том, как Swift обрабатывает очереди выполнения, оставляя за собой все, чего нет в моем ViewController, что мешает мне.
Я покажу вам некоторые из кода, чтобы вы могли лучше расширить то, что я говорю.
Функция кнопки моего ViewController:Порядок выполнения принудительного действия - Swift3/Xcode8 - Темы

@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 
    }   
} 

Я знаю концепцию параллелизма и параллелизма и исследования я был в состоянии понять, что это Свифт родной приоритеты интерфейса, который делает все жидкости, но моя проблема что моя функция FadbaWS.buscaAluno никогда не выполняется и, следовательно, никогда не возвращает действительное значение.
Как я могу отдать приоритет, чтобы мой код выполнялся только после выполнения этой функции?
Как обрабатывать DispatchQueue в Swift?
Прямо сейчас, благодарный!

ответ

0

На какой нить FadbaWS.buscaAluno бежать? Есть ли обработчик завершения?

Вы упомянули, что FadbaWS.buscaAluno реализуется в конце функции. Это может означать, что он запускается асинхронно на mainQueue. Если это так, то вы можете просто выполнить другие задачи, отправив их асинхронно в основной очереди.

DispatchQueue.main.async { 
if dadosAlunoWS.sucesso && dadosAlunoWS.usuarioEncontrado{ 
     print(dadosAlunoWS.name) 

    }else{ 

     //Error on request 
    }  
} 

Это будет работать, потому что mainQueue является по существу последовательной очереди, и здесь мы присваиваем задачи последовательно на основной очереди. Хотя это будет работать, но было бы лучше, если бы вы могли реализовать обработчик завершения по методу FadbaWS.buscaAluno.

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) 

     } 
    } 
Смежные вопросы