2017-08-01 1 views
1

J'essaie d'implémenter l'ID tactile dans mon application. Je réussis à faire fonctionner l'ID tactile, mais il me faut 10 à 15 secondes avant de passer au Viewcontroller suivant. J'ai cherché sur le sujet, et il semble que la solution est de l'exécuter dans le fil principal. J'ai ensuite changé mon code pour l'exécuter en tant que thread principal (je pense), mais le problème est toujours là. Quelqu'un peut-il voir ce qui ne va pas?Touch ID IOS 10 prend 10 - 15 secondes pour répondre

func logMeIn(){ 

    performSegue(withIdentifier: "notesVC", sender: self) 
} 


@IBAction func loginButton(_ sender: Any) { 

    let context:LAContext = LAContext() 

    if context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: nil){ 
     context.evaluatePolicy(LAPolicy.deviceOwnerAuthenticationWithBiometrics, localizedReason: "Log in", reply: { (wasSuccessful, error) in 
      if wasSuccessful{ 
       OperationQueue.main.addOperation({() -> Void in }) 
       self.logMeIn() 
      } 
      else { 
       self.view.backgroundColor = UIColor.red 
      } 
     }) 
    } 
} 
} 
+0

Ce n'est pas comment vous avez quelque chose sur le fil principal. Vous devez faire 'DispatchQueue.main.async {// écrire le code que vous voulez exécuter sur le thread principal ici}'. Ou si vous voulez coller avec 'OperationQueue', vous devez toujours déplacer tout le code qui doit s'exécuter sur le thread principal ** à l'intérieur ** de la fermeture de' addOperation'. –

+1

Merci beaucoup. Fonctionne bien quand je l'ai fait: if wasSuccessful { OperationQueue.main.addOperation ({() -> Void dans self.logMeIn()}) –

+0

Heureux que cela a fonctionné. J'ai posté mon commentaire en réponse, donc d'autres personnes rencontrant le même problème peuvent le trouver plus facile. Si vous l'avez trouvé utile, veuillez envisager d'accepter la réponse. –

Répondre

1

Ce n'est pas ainsi que vous exécutez quelque chose sur le thread principal. Vous devez déplacer tout le code qui doit fonctionner sur le fil principal à l'intérieur de la fermeture de addOperation, comme ceci:

if wasSuccessful{ 
    OperationQueue.main.addOperation({() -> Void in self.logMeIn()}) 
} 

Ou vous pouvez aussi faire

DispatchQueue.main.async{ 
    //write the code you want to run on the main thread here 
}