iOS DispatchQueue.main.sync не работает Swift 4 Xcode 9 - PullRequest
0 голосов
/ 27 июня 2018

Я пытаюсь получить TouchID для проверки подлинности действия в моем приложении. Мне нужно, чтобы показать ImageView в случае успеха.

Вот код, который я имею в ViewController

@IBOutlet weak var notificationImage: UIImageView!
@IBAction func touchBtn(_ sender: UIButton) {    
    context = LAContext()
    var error: NSError?
    if context.canEvaluatePolicy(.deviceOwnerAuthentication, error: &error) {
        let reason = "Authenticate"
        context.evaluatePolicy(.deviceOwnerAuthentication, localizedReason: reason ) { success, error in
             if success {
                 print("In closure")
                 // Move to the main thread because a state update triggers UI changes.
                 DispatchQueue.main.async{
                     print("In main thread: Success")
                     self.notificationImage.isHidden = false
                  }
              } else {
                  DispatchQueue.main.async(execute: {
                      print("In main thread: Failed")
                  })
              }    
          }
      }
}

Я могу успешно пройти аутентификацию с помощью TouchID. Это печатает "В закрытии". Но блок в DispatchQueue.main.async не выполняется, и я не могу обновитьtificationImage: UIImageView. Он также ничего не печатает в блоках синхронизации {}.

Я попытался отключить Main Thread Checker и удалить часть DispatchQueue.main.async, но представление иногда обновляется, а иногда нет. Я хочу использовать рекомендованную практику и обновить пользовательский интерфейс из основного потока.

Я нахожусь на Xcode 9 Swift 4 iOS 11.4

Что здесь может быть не так.

1 Ответ

0 голосов
/ 27 июня 2018

попробуйте этот код

  @IBAction func touchBtn(_ sender: UIButton) {
   let context = LAContext()
    var error: NSError?
    if context.canEvaluatePolicy(.deviceOwnerAuthentication, error: &error) {
        let reason = "Authenticate"
        context.evaluatePolicy(.deviceOwnerAuthentication, localizedReason: reason ) { success, error in
            if success {
                do {
                    print("In closure")
                    print("In main thread: Success")
                    self.notificationImage.isHidden = false

                } catch let error as NSError {
                    print(error.localizedDescription)
                    print(error.description)
                }

            } else {
                DispatchQueue.main.async(execute: {
                    print("In main thread: Failed")
                })
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...