如何在Swift编程中修复NSInternalInconsistencyException

时间:2019-08-30 13:44:19

标签: ios swift

我正在创建一个新的应用程序,并且要放在一个隐藏的文件夹中。可通过人脸ID /触摸ID进行访问。我已经实现了代码,但是当我运行应用程序并使用Face ID时。该应用程序崩溃并显示错误“ NSInternalInconsistencyException”

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Modifications to the layout engine must not be performed from a background thread after it has been accessed from the main thread.

在Viewcontroller中,我将视图设置为:

override func viewDidLoad() {
    super.viewDidLoad()


    let cornerRadius : CGFloat = 10.0
    containerView.layer.cornerRadius = cornerRadius
    tableView.clipsToBounds = true
    tableView.layer.cornerRadius = 10.0


    // 1
    let context = LAContext()
    var error: NSError?

    // 2
    // check if Touch ID is available
    if context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &error) {
        // 3
        let reason = "Authenticate with Biometrics"
        context.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, localizedReason: reason, reply: {(success, error) in
            // 4
            if success {
                self.showAlertController("Biometrics Authentication Succeeded")
            } else {
                self.showAlertController("Biometrics Authentication Failed")
                }
           })
     }
     // 5
     else {
         showAlertController("Biometrics not available")
    }
}

我希望Face ID / Touch ID能够按预期工作,并且在验证后不会崩溃。

2 个答案:

答案 0 :(得分:2)

您正在后台线程上进行UI调用(显示警报),因此出现此问题。

更改以下内容

if success {
    self.showAlertController("Biometrics Authentication Succeeded")
} else {
    self.showAlertController("Biometrics Authentication Failed")
}

DispatchQueue.main.async {
    if success {
        self.showAlertController("Biometrics Authentication Succeeded")
    } else {
        self.showAlertController("Biometrics Authentication Failed")
    }
}
  

如果您要更新用户界面   部分,请记住始终使用DispatchQueue.main.async运行这些任务。   UI更改必须在主线程中运行。

How to add FaceID/TouchID using Swift 4

如果您向下滚动到Evaluate a Policy部分,也可以查看Logging a User into Your App with Face ID or Touch ID - Apple Documentation

答案 1 :(得分:0)

错误非常明显:

  

从主线程访问布局引擎后,不得从后台线程对其进行修改。

您无法像尝试使用tbl回调那样从主线程之外的任何线程编辑UI。您应该将UI修改代码放入对evaluatePolicy

的调用中